I hate to be a party pooper, but isn't this just:

> f = foldr (\a z -> (a:snd z,fst z)) ([],[])

This takes less time to grok and takes no longer to run.

But why stop there?

> import Control.Arrow
> swap = snd &&& fst

> f = foldr (\a -> swap >>> first (a:)) ([],[])

Just read this aloud to see what it does (without the tilde encryption algorithm at work!).

More importantly, there is manifestly no pattern failure to check for here.

It is fun that with ~p we don't need deconstructors for p (reminds me of Lisp's setf), but how many types have exported constructors with no deconstructors?

And Arrow notation makes up for the loss of fun, so you don't feel cheated. :)

Dan

P.S. Either doesn't count, because you can easily roll your own deconstructors:

getLeft  = either id undefined
getRight = either undefined id

but I honestly don't know why these aren't in Data.Either.

Or for that matter, why swap is not in Control.Arrow, since it comes in handy quite frequently with pointless programming.

ok wrote:
Someone mentioned the "Blow your mind" page.
One example there really caught my attention.
 "1234567" => ("1357","246")
 foldr (\a ~(x,y) -> (a:y,x)) ([],[])

I've known about lazy match since an early version of the Haskell
report, but have never actually used it.  Last night, looking at
that example, the lights went on and I finally grokked why it's
there and understood when/why I might use it myself.

Oh, I knew perfectly well what it does.  It just never made itself
at home in my head.

I'd like to recommend this example for some sort of prize, therefore.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe




_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to