列表monad是given here。另见Spivak的paper here。所以列表是monad。这是一个comonad?你会如何证明这一点?
答案 0 :(得分:1)
列表类型构造函数a ↦ μ L. 1 + a * L
不承认comonad结构。回想一下,如果它是一个comonad,我们会(使用Haskell的Functor
和Comonad
类型类中的名称)
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]]
(注意)他们每个都是非空的建筑)。