列出monad和comonad?

时间:2016-04-20 20:57:20

标签: list monads comonad

列表monad是given here。另见Spivak的paper here。所以列表是monad。这是一个comonad?你会如何证明这一点?

1 个答案:

答案 0 :(得分:1)

列表类型构造函数a ↦ μ L. 1 + a * L不承认comonad结构。回想一下,如果它是一个comonad,我们会(使用Haskell的FunctorComonad类型类中的名称)

fmap :: ∀  a b. (a → b) → [a] → [b]
extract :: ∀  a. [a] → a
duplicate :: ∀  a. [a] → [[a]]

但是,即使没有遵守任何必要的法律,extract也无法实施,因为它的输入可能是空列表,因此无法提出a

非空列表类型构造函数a ↦ μ NE. a + a * NE确实允许一个comonad结构,extract返回第一个元素,duplicate映射[x, y, ..., z][[x], [x, y], ..., [x, y, ..., z]](注意)他们每个都是非空的建筑)。