On Tue, Mar 31, 2009 at 11:44 PM, wren ng thornton <wren@freegeek.org> wrote:
Another tricky thing for this particular example is answering the question of what you want to call the "focus". Usually zippered datastructures are functors, so given F X we can pick one X to be the focus and then unzip the F around it.
The functor part isn't important. You can make a zipper from any recursive structure. data Expr = Var String | Lit Int | App Expr Expr | Abs String Expr data ExprCtx = AppC1 Expr | AppC2 Expr | AbsC String data ExprZ = ExprZ { ctx :: [ExprCtx], focus :: Expr } In general, if I have a type T and functors F and F' such that T is isomorphic to F T and F' is the derivative of F, then ([F' T], T) is a zipper for T. -- Dave Menendez <dave@zednenem.com> <http://www.eyrie.org/~zednenem/>