为列表Monad定义绑定的类型路径

时间:2013-08-13 22:24:04

标签: haskell

了解你一个Haskell 的文本中,列表monad的定义如下:

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

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

1 个答案:

答案 0 :(得分:3)

map的类型为(a -> b) -> [a] -> [b]

f的类型为a -> m b

在列表monad中,f的类型为:a -> [b]

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