Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Lens implementation in Erlang
Erlang
tree: 4be1139230
Failed to load latest commit information.
src More doc.
.gitignore Handle isomorphism halfway.
Makefile Handle isomorphism halfway.
README.md Bump readme with intuition.
rebar.config Handle isomorphism halfway.

README.md

Functional Lenses for Erlang

This project implements a single (heavily commented) file, lens.erl which implements functional lenses in Erlang. I've been wanting to check out the implementation of this for some time now, and Spawnfest 2012 was as good as any occasion.

A lens is a generalized accessor/mutator pattern in a functional persistent setting. It allows us to chain and compose such accessors, much like the normal foo.bar.baz() chaining in most OO languages. It also starts a library for producing ways to "dig" into structures much like xpath queries in XML. But on the contrary it also allows for functional update and alteration of the same structures.

The intuition of a lens is as a lens in a camera. When we view a structure through the lens, we get an abstract view of what lies behind, twisted by the lens. This allows us to manipulate the structure behind the lens by casting it in a different light. We can pull the structure through the lens, operate on it, and then push it back through the lens to obtain what it originally was, but changed.

This project should be seen mostly as exploration of the concept. It is not yet ready for drop-in into large projects. But it can over time be made into such.

Finally, you will need eqc-mini. All the code is run through Erlang QuickCheck in order to make sure we have a somewhat firm ground on which to stand. That is, all our lens hacking is probalistically checked for correctness. We also use eunit for certain simpler tests in the code where we want to verify the point query of a given result. If you have access to EQC mini you should be able to run lens:t() in order to check the module. It runs both the eunit and EQC suites.

Something went wrong with that request. Please try again.