1

Learn You A Haskell文本中,列表 monad 的定义如下:

instance Monad [] where
    return x = [x]
    xs >>= f = concat (map f xs)
    fail _   = []

由于绑定运算符应该将列表值转换为裸值并concat修剪一层列表,所以这个定义乍一看是有道理的。[a]但是,当 map 的输出类型, 与 concat 的输入类型不匹配时,该定义如何编译[[a]]

4

1 回答 1

3

map有类型(a -> b) -> [a] -> [b]

f有类型a -> m b

在 List monad 中,类型是fa -> [b]

所以map f :: [a] -> [[b]]

于 2013-08-13T22:45:48.913 回答