Why use such a peculiar function type in monads?

后端 未结 5 1172
温柔的废话
温柔的废话 2020-12-06 16:32

New to Haskell, and am trying to figure out this Monad thing. The monadic bind operator -- >>= -- has a very peculiar type signature:

(>         


        
5条回答
  •  日久生厌
    2020-12-06 17:03

    The thing that makes a monad a monad is how 'join' works. Recall that join has the type:

    join :: m (m a) -> m a
    

    What 'join' does is "interpret" a monad action that returns a monad action in terms of a monad action. So, you can think of it peeling away a layer of the monad (or better yet, pulling the stuff in the inner layer out into the outer layer). This means that the 'm''s form a "stack", in the sense of a "call stack". Each 'm' represents a context, and 'join' lets us join contexts together, in order.

    So, what does this have to do with bind? Recall:

    (>>=) :: m a -> (a -> m b) -> m b
    

    And now consider that for f :: a -> m b, and ma :: m a:

    fmap f ma :: m (m b)
    

    That is, the result of applying f directly to the a in ma is an (m (m b)). We can apply join to this, to get an m b. In short,

    ma >>= f = join (fmap f ma)
    

提交回复
热议问题