haskell - 仿函数和内仿函数之间的区别

标签 haskell functional-programming functor

有人可以简单地解释一下两者之间的区别吗?我不完全理解单子(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/

相关文章:

haskell - 卡住haskell STrefs

c++ - 将成员函数作为参数传递给优化器(将成员函数传递给函数)

c++ - 最优雅的可变函数

haskell - Yesod respondSource 来自具有 PrimMonad 约束的源

networking - 1个处理 channel ,2个同类型IO源

javascript - 如何使用柯里化(Currying)有条件地将数据传递给函数

javascript - 用于组合身份和副作用的函数式编程构造

haskell - 如何使用 foldr 编写此函数?

c++ - 仿函数成员中的状态数据与全局函数

haskell - 函数箭头右侧的 forall 是什么意思?