[Haskell-beginners] I don't understand mapM in mapM id (Just 1, Nothing, Just 3)
Sebastian Hungerecker
sepp2k at googlemail.com
Sun Jun 5 18:31:37 CEST 2011
On 05.06.2011 14:40, Haisheng Wu wrote:
> By looking at sequence implementation in Hugs:
>
> sequence (c:cs) = do x<- c
> xs<- sequence cs
> return (x:xs)
>
> Apply it against a list [Just 2, Nothing], we will have:
> sequence [Just 2, Nothing]
> = do x<- Just 2
> y<- sequence [Nothing]
> return (x:y)
> = return (2:Nothing)
>
> The question is
> Why/How `return (2:Nothing)` eval to `Nothing` ?
>
It doesn't. You went wrong in the last equality there. y doesn't have
the value Nothing, in fact it never gets a value at all.
Let's first look at what sequence [Nothing] evaluates to:
do x <- Nothing
y <- sequence [Nothing]
return (x:y)
Since Nothing >>= f evaluates to Nothing this means that the above
do-block evaluates to Nothing, too. So y <- sequence [Nothing] becomes
y <- Nothing and again the whole expression evaluates to Nothing and
return (x:y) never is evaluated.
More information about the Beginners
mailing list