函数者和单子之间的区别是什么?

人气:628 发布:2022-10-16 标签: functional-programming monads functor

问题描述

这里有类似的问题,但它们与特定的编程语言有关,我正在寻找概念级别的答案。

据我所知,函数器本质上是不变的容器,它公开派生另一个函数器的map()API。哪项添加使将特定的函数器称为单体成为可能?

据我所知,每个单子都是函子,但并不是每个函子都是单子。

推荐答案

(请注意,这将是对范畴理论概念的简化解释)

函数器

函数器是从一组值a到另一组值a -> b的函数。对于编程语言,这可能是来自String -> Integer

的函数

function fn(text: string) : integer

组成

合成是指使用一个函数的值作为下一个函数的值的输入:fa(fb(x))。例如:

hash(lowercase(text))

单数

Monad允许合成以其他方式无法合成的函数器,或通过在合成中添加额外功能来合成函数器,或者两者兼而有之。

第一个示例是函数器的MonadString -> (String, Integer)

第二个示例是对值调用的函数数进行计数的Monad

Monad包括负责所需功能的函数器T以及另外两个函数:

input -> T(input) T(T(input)) -> T(input)

第一个函数允许将您的输入值转换为Monad可以组合的一组值。第二个函数允许进行合成。

因此,总而言之,每个Monad不是函数器,而是使用函数器来完成其目的。

112