[Haskell-cafe] Re: (a -> [b]) -> [a -> b] ?

apfelmus at quantentunnel.de apfelmus at quantentunnel.de
Wed Dec 6 06:28:39 EST 2006

> while pondering over the four fours problem, I wondered: Is there a
> function of type
> 	(a -> [b]) -> [a -> b]
> It looks a bit like sequence when applied in the ((->) a) Monad:
> 	sequence :: [a -> b] -> a -> [b]
> but I was looking for the other direction.
> I came up with:
> 	\g -> map (\n a -> g a !! n) [1..]
> which has the desired type and functionality, but it looks rather
> inelegant and messy. Any better ideas?

While you showed that there exists

    unsequence :: (a -> [b]) -> [a -> b]   ,

I doubt that it's very useful. The point is that (sequence) is not
surjective: (a -> [b]) has strictly more functions than [a -> b]. (a ->
[b]) has the freedom to adjust the length of the resulting depending on
a list whereas [a -> b] hasn't.

(sequence) converts an Applicative Functor to a Monad but there is no
canonical other way round. In other words,

       unsequence . sequence === id
but    sequence . unsequence =/= id


More information about the Haskell-Cafe mailing list