gpt4 book ai didi

haskell - Monad 连接函数

转载 作者:行者123 更新时间:2023-12-03 10:07:06 26 4
gpt4 key购买 nike

虽然 monad 在 Haskell 中使用 bind 和 return 函数表示,但它们也可以使用 join 函数有另一种表示,例如 discussed here .我知道这个函数的类型是 M(M(X))->M(X),但这实际上是做什么的呢?

最佳答案

实际上,在某种程度上,join是所有魔法真正发生的地方-- (>>=)主要用于方便。

全部 Functor -based 类型类使用某种类型描述附加结构。与 Functor这个额外的结构通常被认为是一个“容器”,而 Monad它往往被认为是“副作用”,但这些只是(有时会误导)速记——无论哪种方式都是一样的,并没有什么特别的 [0] .
Monad 的显着特点与其他 Functor 相比s 是它可以将控制流嵌入到额外的结构中。它可以这样做的原因是,与 fmap 不同。它在整个结构上应用单个平面函数,(>>=)检查单个元素并从中构建新结构。

用朴素的Functor ,从原始结构的每一 block 构建新结构将改为嵌套 Functor ,每一层代表一个控制流点。这显然限制了实用程序,因为结果是困惑的并且具有反射(reflect)所使用的流控制结构的类型。

一元“副作用”是具有一些附加属性的结构 [1] :

  • 两个副作用可以归为一个(例如,“do X”和“do Y”变成“do X, then Y”),只要保持效果的顺序,分组的顺序无关紧要。
  • 存在“什么都不做”的副作用(例如,分组的“做 X”和“什么都不做”与“做 X”相同)
  • join函数只不过是分组操作:像 m (m a) 这样的嵌套 monad 类型描述了两种副作用及其发生的顺序, join将它们组合在一起形成一个单一的副作用。

    因此,就一元副作用而言,绑定(bind)操作是“取一个具有相关副作用的值和一个引入新副作用的函数,然后将函数应用于该值,同时组合每个副作用的值”的简写.

    [0]:除了 IO . IO很特别。

    [1]:如果将这些属性与 Monoid 实例的规则进行比较你会看到两者之间的密切相似之处——这不是巧合,实际上是“只是内仿函数类别中的一个幺半群,有什么问题?”线是指。

    关于haskell - Monad 连接函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3382210/

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