作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以简单地解释一下两者之间的区别吗?我不完全理解单子(monad)是仿函数与仿函数的部分。
最佳答案
仿函数可以从一个类别转到另一个类别,endofunctor 是起始类别和目标类别相同的仿函数。
与自同态与态射相同。
现在,为什么单子(monad)必须是内仿函数?
有句著名的话是“单子(monad)只是内仿函数类别中的幺半群”。幸运的是,其他人已经解释得相当好in this answer .
单子(monad)必须是一个endofunctor的关键点是join
,它在Haskell中被称为,或者μ
,因为它通常在类别中被称为理论,是单子(monad)定义的一部分。现在
Prelude Control.Monad> :t join
join :: Monad m => m (m a) -> m a
因此,将仿函数 m
应用于对象(在 Hask 中,Haskell 类型作为对象和函数作为态射的类别,一种类型)的结果必须是一个 m
可以再次应用。这意味着它必须属于仿函数 m
域的类别。
如果仿函数的域和辅助域相同(严格来说,如果其辅助域是其域的子类别),换句话说,如果它是一个内仿函数,则该仿函数只能与自身组成。由于与其自身的可组合性是 monad 定义的一部分,因此 monad 更不用说是内仿函数了。
1 一种定义,也可以使用 (>>=)
或 bind
定义 monad,并将 join
作为派生属性。
关于haskell - 仿函数和内仿函数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10342876/
我是一名优秀的程序员,十分优秀!