问题描述
这里有类似的问题,但它们与特定的编程语言有关,我正在寻找概念级别的答案。
据我所知,函数器本质上是不变的容器,它公开派生另一个函数器的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不是函数器,而是使用函数器来完成其目的。