gpt4 book ai didi

functional-programming - Functor 和 Monad 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 20:53:58 24 4
gpt4 key购买 nike

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

据我了解,Functor 本质上是不可变的容器,它公开了派生另一个仿函数的 map() API。哪个加法可以将特定仿函数称为 monad?

据我了解,每个单子(monad)都是仿函数,但并非每个仿函数都是单子(monad)。

最佳答案

让我在不涉及范畴论的情况下解释我的理解:
仿函数和单子(monad)都提供了一些 工具 包装输入,返回包装输出。
仿函数 = 单位 + map (即工具)
在哪里,unit = 接受原始输入并将其包装在一个小上下文中的东西。map = 将函数作为输入的工具,将其应用于包装器中的原始值,并返回包装后的结果。
示例:让我们定义一个将整数加倍的函数

// doubleMe :: Int a -> Int b
const doubleMe = a => 2 * a;
Maybe(2).map(doubleMe) // Maybe(4)
单子(monad) = unit + flatMap(或绑定(bind)或链) flatMap = 使 map 变平的工具,顾名思义。用下面的例子很快就会清楚。
示例:假设我们有一个柯里化(Currying)函数,它仅在两个字符串都不为空时附加两个字符串。
让我定义一个如下:
append :: (string a,string b) -> Maybe(string c)  
现在让我们看看 map 的问题。 ( Functor 自带的工具),
Maybe("a").map(append("b")) // Maybe(Maybe("ab"))  
怎么有两个 Maybe在这里吗?
嗯,就是这样 map做;它将提供的函数应用于包装的值并包装结果。
让我们把它分成几个步骤,
  • 将映射函数应用于包装值
    ;这里映射的函数是append("b")包装后的值为 "a" ,结果为 Maybe("ab") .
  • 包装结果,返回 Maybe(Maybe("ab")) .

  • 现在我们感兴趣的值被包裹了两次。来了 flatMap救援。
    Maybe("a").flatMap(append("b")) // Maybe("ab")
    当然,仿函数和单子(monad)也必须遵循其他一些规律,但我相信这不在所要求的范围内。

    关于functional-programming - Functor 和 Monad 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45252709/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com