[Haskell-beginners] Just clarifying the "pred" and "succ" functions in Haskell

Felipe Lessa felipe.lessa at gmail.com
Sat Feb 6 06:02:31 EST 2010


On Sat, Feb 06, 2010 at 01:45:58AM -0500, Brandon S. Allbery KF8NH wrote:
> Andy Elvey wrote:
> >So, I may look at doing what I would call "lpred" and lsucc" - the
> >predecessor and successor of a list element. I'm somewhat
> >surprised that (from what I can tell) Haskell doesn't seem to have
> >those two functions for a list. I may be wrong....
>
> Again, lists don't work that way; a list in Haskell is a single
> immutable object, you can pull items from it using (!!), head, etc.,
> but you can't have a pointer into the "middle" of a list.  You can
> have a sublist (for example, `tail ["foo", "bar", "baz"]' = `["bar",
> "baz"]') --- but you can't get from there to the "foo", as it isn't
> part of that new list.  (This despite the fact that what `tail'
> gives you is going to be shared in actual storage with the original
> list.  You don't have a backpointer into that original list to
> follow.)

Although we can't have a pointer to the middle of a list [a], we
can have another data struture that behaves sort of as if we had
that pointer: a zipper.  For example,

http://hackage.haskell.org/packages/archive/ListZipper/1.1.1.0/doc/html/Data-List-Zipper.html

To understand a list zipper you could think of it as something like

  struct zipper {
    list left, right;
  }

So we track our "position" by tracking what's on the left and
what's on the right.  By using the API of the link above you
could have something similar to what you wanted:

  lpred :: Zipper a -> a
  lpred = focus . left

  lsucc :: Zipper a -> a
  lsucc = focus . right

--
Felipe.


More information about the Beginners mailing list