- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,Haskell 的 distributive
library docs 中提到了 Comonoids :
Due to the lack of non-trivial comonoids in Haskell, we can restrict ourselves to requiring a Functor rather than some Coapplicative class.
经过一番搜索,我发现了 StackOverflow answer这用 comonoid 必须满足的定律更好地解释了这一点。所以我想我明白为什么 Haskell 中假设的 Comonoid 类型类只有一个可能的实例。
因此,为了找到一个不平凡的共类群,我想我们必须寻找其他类别。当然,如果范畴论学家给共谐函数起了一个名字,那么就会有一些有趣的名字。该页面上的其他答案似乎暗示了一个涉及 Supply
的示例,但我无法找出仍然满足法律的答案。
我还查阅了维基百科:有一个关于幺半群的页面没有引用范畴论,在我看来,这足以描述 Haskell 的 Monoid
类型类,但“comonoid”重定向到一个类别-我无法理解幺半群和共半群的理论描述,而且似乎仍然没有任何有趣的例子。
所以我的问题是:
编辑:我不确定这实际上在类别理论上是否正确,但我在问题 2 的括号中想象的是 delete::a -> m 的重要定义()
和 split::a -> m (a, a)
对于某些特定的 Haskell 类型 a
和 Haskell monad m
满足链接答案中科莫尼定律的 Kleisli 箭头版本。仍然欢迎其他 comonoid 的例子。
最佳答案
正如 Phillip JF 提到的,在子结构逻辑中讨论共类群很有趣。我们来谈谈线性 lambda 演算。这很像普通的类型化 lambda 演算,只不过每个变量必须只使用一次。
为了感受一下,让我们count linear functions of given types ,即
a -> a
只有一个居民,id
。虽然
(a,a) -> (a,a)
有两个,id
和 flip
。请注意,在常规 lambda 演算中,(a,a) -> (a,a)
有四个居民
(a, b) ↦ (a, a)
(a, b) ↦ (b, b)
(a, b) ↦ (a, b)
(a, b) ↦ (b, a)
但是前两个要求我们使用其中一个参数两次,同时丢弃另一个。这正是线性 lambda 演算的本质——不允许使用此类函数。
<小时/>顺便说一句,线性 LC 有什么意义?好吧,我们可以用它来模拟线性效应或资源使用情况。例如,如果我们有一个文件类型和一些转换器,它可能看起来像
data File
open :: String -> File
close :: File -> () -- consumes a file, but we're ignoring purity right now
t1 :: File -> File
t2 :: File -> File
然后以下是有效的管道:
close . t1 . t2 . open
close . t2 . t1 . open
close . t1 . open
close . t2 . open
但是这个“分支”计算不是
let f1 = open "foo"
f2 = t1 f1
f3 = t2 f1
in close f3
因为我们使用了 f1
两次。
现在,您可能想知道哪些事物必须遵循线性规则。例如,我决定某些管道不必同时包含 t1
和 t2
(比较之前的枚举练习)。此外,我还介绍了 open
和 close
函数,它们愉快地创建和销毁 File
类型,尽管这违反了线性性。
事实上,我们可能会假设存在违反线性的函数,但并非所有客户端都会这样做。它很像 IO
monad — 所有 secret 都存在于 IO
的实现中,以便用户在“纯粹”的世界中工作。
这就是 Comonoid
发挥作用的地方。
class Comonoid m where
destroy :: m -> ()
split :: m -> (m, m)
在线性 lambda 演算中实例化 Comonoid
的类型是一种具有随身破坏和复制规则的类型。换句话说,它是一种根本不受线性 lambda 演算束缚的类型。
由于 Haskell 根本没有实现线性 lambda 演算规则,因此我们始终可以实例化 Comonoid
instance Comonoid a where
destroy a = ()
split a = (a, a)
或者,也许另一种思考方式是 Haskell 是一个线性 LC 系统,它恰好为每种类型实例化 Comonoid
并应用 destroy
和 自动为您分割
。
关于haskell - 一个不平凡的共同类群是什么样子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23855070/
所以,我有一个类似于 this one 的用例,但我觉得有一些额外的细节值得提出一个新问题。 ( related questions ,供引用) 我正在编写一个实现 a cycle 的数据结构.基本设
我正在使用 Django 编写一个社交网络应用程序,需要实现类似于 Facebook“Mutual Friends”概念的功能。我有一个像这样的简单模型: class Friend(models.Mo
我有一个 iOS 应用程序,用户可以在其中使用 Facebook 登录并授予 user_friends 权限。从 Graph API 2.0 开始,Facebook 声称你无法获取两个人之间所有的共同
我想知道将来对我来说最简单的方法是什么,可以使查询既有效又不那么复杂。 我应该像这样保存双向关系吗 from_id=1, to_id=2from_id=2, to_id=1 或者只创建一个唯一的行 f
我是一名优秀的程序员,十分优秀!