[Haskell-beginners] Maybe and Just

Frerich Raabe raabe at froglogic.com
Thu Mar 26 10:34:58 UTC 2015


Hi,

On 2015-03-26 11:06, Shishir Srivastava wrote:
> After reading and re-reading the haskell tutorials I don't happen to see a 
> very convincing or appealing reason for having these data types.

First of all, only one of them is a type (or a 'type constructor'): "Maybe". 
"Just" on the other hand is a "data constructor", i.e. "Just 'x'" will yield 
a value of type "Maybe Char".

> Can anyone please explain where Maybe and Just provide the sort of 
> functionality that cannot be achieved in other languages which don't have 
> these kind.

They don't provide anything which other languages cannot achieve. 'Maybe' 
values merely indicate that you *maybe* get a value. This is useful for 
functions which might not be able to yield a meaningful result. Consider a 
'safeHead' function which works like 'head', returning the first element of a 
given list. What should it do for empty lists?

Something like 'Maybe' is useful because it

1. Makes potential errors clearly visible in the type system: If a function 
returns a 'Maybe Char', you know that it possible won't yield a Char (but 
rather 'Nothing'). Raising an exception is totally opaque to the caller.

2. Clearly separates the values which might represent failures from those 
which don't. Contrast this with e.g. Java, where every object of every type 
can be null. If every value is potentially 'null', you either have to check 
using if() everywhere or use assertions. With 'Maybe', the null'ness can be 
asserted by the compiler.

3. Relieves other types from having an explicit 'Invalid' value. Consider:

   data Color = Red | Green | Blue | Invalid

   -- Parses a color string; yields 'Invalid' if the string is malformed
   parseColor :: String -> Color
   parseColor = undefind

With a setup like this, *every* code dealing with 'Color' values will have to 
be able to handle 'Invalid' colors. It ripples through the system. OTOH, 
something like

   data Color = Red | Green | Blue

   -- Parses a color string; yields 'Nothing' if the string is malformed
   parseColor :: String -> Maybe Color
   parseColor = undefined

Clearly separates the valid colors, such that only the caller of 'parseColor' 
only has to check for 'Just x' values - and if it got one, it can pass the 
'x' value to other code.

For what it's worth, other languages have similiar concepts. For instance, 
C++ programmers can use 'boost::optional' (which, alas, didn't make it into 
C++14).

-- 
Frerich Raabe - raabe at froglogic.com
www.froglogic.com - Multi-Platform GUI Testing


More information about the Beginners mailing list