在了解你一个Haskell 的文本中,列表monad的定义如下:
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs)
fail _ = []
由于绑定运算符应该将列表值转换为裸值并且concat
修剪一个列表层,因此这个定义乍一看是有意义的。但是,当地图的输出类型[a]
与concat的输入类型[[a]]
不匹配时,该定义如何编译?
答案 0 :(得分:3)
map
的类型为(a -> b) -> [a] -> [b]
。
f
的类型为a -> m b
。
在列表monad中,f
的类型为:a -> [b]
,
所以map f :: [a] -> [[b]]