El sáb, 18-09-2010 a las 00:48 +0800, ender escribió:
>> my question is, why not define the function father and mother as type
> of father::Maybe Sheep -> Maybe Sheep? this can also
> clean the code and it avoid the additional function comb
>The composition of these functions would then be nice, yes. However, you
would have to duplicate the ugly handling of Nothings in each of the
functions father, mother, sister, brother, etc.:
father Nothing = Nothing
father (Just x) = ...
And you would still need a function of type Sheep -> Maybe Sheep, to
fill in the dots.
>> further more, why we need a function => with type of => m a -> ( a ->
> m b ) -> mb? define some function with type m a -> m b can solve these
> problems too.
Look at the the type m a -> (a -> m b) -> m b in a slightly different
way, namely by flipping its arguments. You get:
(a -> m b) -> (m a -> m b)
i.e., it transforms a function of type a -> m b into one of type m a ->
m b, which can then be composed by (.). Given that we want to be able to
deal with function of type a -> m b, This is exactly what we want.
The usually given type m a -> (a -> m b) -> m b is just a convention
because of the closer correspondence to the do-notation.
Jürgen