【发布时间】:2013-08-13 22:24:04
【问题描述】:
在文本 Learn You A Haskell 中,列表 monad 的定义如下:
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs)
fail _ = []
由于绑定运算符应该将列表值转换为裸值并且concat 修剪了一层列表,所以这个定义乍一看是有道理的。但是,当 map 的输出类型 [a] 与 concat 的输入类型 [[a]] 不匹配时,如何编译此定义?
【问题讨论】:
-
如果
map的输出中的a恰好是一个列表,则它们匹配。 -
所以教训是:为不同的事情使用不同的类型变量:如果你说“map的输出类型是
[a],concat的输入类型是[[b]],您会立即看到答案为a ~ [b]。:)
标签: haskell