[Haskell-cafe] There is no null; Maybe/Option types

wren ng thornton wren at freegeek.org
Sat Apr 23 06:15:08 CEST 2011


On 4/22/11 3:26 PM, Henning Thielemann wrote:
> On Fri, 22 Apr 2011, Christopher Done wrote:
>
>> Use of Fantom's save invoke and Maybe are more or less the same.
>>
>> -- Hard way
>> email = if userList /= Nothing
>>            then let user = findUser "bob" (fromJust userList)
>>                 in if user /= Nothing
>>                       then getEmail (fromJust user)
>>                       else Nothing
>>            else Nothing
>
> In idiomatic Haskell you would write
>
> case userList of
> Nothing -> Nothing
> Just plainUserList =
> let user = findUser "bob" plainUserList
> ...

Well, in *idiomatic* Haskell you'd write:

     plainUserList <- userList
     user <- findUser "bob" plainUserList
     getEmail user

Or even just:

     getEmail =<< findUser "bob" =<< userList

(As others have mentioned a few times.)

But the greatest thing about Maybe is that you don't *have* to write 
code in monadic style. Because Maybe makes explicit the null-pointer 
shenanigans in other languages, you can simply unwrap the Maybe and pass 
around the raw value instead of letting Nothing permeate your whole 
program. Spending all your time in the Maybe monad is just as bad as 
spending all your time in the IO monad. Purity begets clarity!

Bob Harper has a few things to say[1] about using equality tests instead 
of case analysis, and I agree with him.

[1] http://existentialtype.wordpress.com/2011/03/15/boolean-blindness/

-- 
Live well,
~wren



More information about the Haskell-Cafe mailing list