【问题标题】:Type-Pathway in Defining Bind for the List Monad为 List Monad 定义绑定中的类型路径
【发布时间】: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


【解决方案1】:

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

f 的类型为 a -> m b

在 List monad 中,f 的类型是:a -> [b]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多