Oh I needed join.

computeHead :: (a -> [b]) -> [a] -> [b]
computeHead f = join . take 1 . fmap f

That's because

f :: a -> [b]

not

f: a -> b


On Thu, Nov 12, 2015 at 5:22 AM, Martin Vlk <martin@vlkk.cz> wrote:
How about:

computeHead f = take 1 . fmap f

Martin

Dennis Raddle:
> What would be an elegant way of writing this
>
> computeHead :: (a -> [b]) -> [a] -> [b]
>
> Where when [a] is null, it returns a null list, but when [a] contains one
> or more elements, it applies the given function to the head of a and
> returns that? Is there some existing typeclass operator that facilitates
> this?
>
> You can write
>
> computeHead _ [] = []
> computeHead f (x:_) = f x
>
> But that first line seems suspicious to me... it makes me think about how
> in the list Monad, an empty list falls through. But I can't quite make it
> work.
>
>
>
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners