【发布时间】:2014-05-25 12:04:35
【问题描述】:
例如在 Haskell 的 distributive library docs 中提到了 Comonoids:
由于 Haskell 中缺乏非平凡的 comonoid,我们可以将自己限制为需要 Functor 而不是一些 Coapplicative 类。
经过一番搜索,我找到了一个StackOverflow answer,它用共模类必须满足的定律来解释这一点。所以我想我理解为什么在 Haskell 中只有一个假设的 Comonoid 类型类的可能实例。
因此,要找到一个非平凡的类群,我想我们必须寻找其他类别。当然,如果范畴理论家有一个名称为类黑素,那么就会有一些有趣的名称。该页面上的其他答案似乎暗示了一个涉及Supply 的示例,但我想不出一个仍然符合法律规定的答案。
我也求助于 Wikipedia:有一个关于 monoids 的页面没有引用类别理论,在我看来这足以描述 Haskell 的 Monoid 类型类,但“comonoid”重定向到对 monoids 的类别理论描述和comonoids放在一起我看不懂,而且似乎还没有什么有趣的例子。
所以我的问题是:
- 可以用像幺半群这样的非范畴理论术语来解释类群吗?
- 什么是有趣的共形类的简单示例,即使它不是 Haskell 类型? (可以在熟悉的 Haskell monad 的 Kleisli 类别中找到一个吗?)
编辑:我不确定这是否真的在类别理论上是正确的,但我在问题 2 的括号中想象的是 delete :: a -> m () 和 split :: a -> m (a, a) 的一些重要定义 特定 Haskell 类型 a 和 Haskell monad m 在链接答案中满足 Kleisli-arrow 版本的 comonoid 定律。仍然欢迎使用其他类黄酮的例子。
【问题讨论】:
-
什么是类摩线定律的 Kleisli 箭头版本?假设我有
Z_n对应a和[]对应m,我的运算符是:delete _ = []; split x = [(0, x), (1, x+1), ... (n-1, x+n-1)](所有加法都是模n)。如何检查是否符合法律规定?假设我要检查idL $ first delete $ split x = x,如何将其提升到[]monad? -
再想一想,如果你只是用 return 和 fmap 和 bind 将法则提升到 monad,那么这些提升的法则将完全等同于正常的 comonoid 法则,所以你仍然只有琐碎的例子。