gpt4 book ai didi

haskell - 关于 Haskell 中 monad 的一些问题

转载 作者:行者123 更新时间:2023-12-04 01:23:35 27 4
gpt4 key购买 nike

我正在学习单子(monad)并有几个问题。

这就是我现在的位置。请纠正我哪里错了。

  • >>= symbol 是中缀运算符。中缀运算符是接受两个参数(左侧和右侧)并返回一个值的函数。
  • >>=符号称为绑定(bind)运算符,并具有签名 Monad m => m t -> (t -> m u) -> m u .但是,这些类型似乎并没有在这里排列。我们得到一个 m t 类型的值第二个参数是一个接受 t 的函数. (我不知道如何连接这些点。)
  • 这一定意味着绑定(bind)函数能够以某种方式移除m。来自 m t为了得到t并将其传递给函数。

  • 以下是我的问题:
  • 是否能够删除 m来自 m t只有在这样的绑定(bind)运算符中才有可能。这个绑定(bind)运算符是否有一些特殊的特权或什么?
  • 它与状态变化有什么关系?我理解(我认为)单子(monad)的目标是“包装”副作用,以便它们与程序的其余部分隔离。但是绑定(bind)运算符在其中的作用是什么?
  • 最佳答案

    is the ability to remove the 'M' from 'M t' something that is only possible inside such a bind operator.



    好吧,在绑定(bind)运算符中肯定是可能的,因为它的类型指定:
    (>>=) :: m a -> (a -> m b) -> m b

    您的 monad 的“运行”函数通常也可以执行此操作(从您的计算中返回一个纯值)。

    the goal of monads is to 'wrap' side-effects so that they are isolated from the rest of the program



    唔。不,单子(monad)让我们对计算的概念进行建模。副作用计算只是这样一个概念,状态、回溯、延续、并发、事务、可选结果、随机结果、可恢复状态、非确定性......所有这些 can be described as a monad

    我假设你指的是 IO monad。这是一个有点奇怪的 monad——它生成对世界状态的抽象变化序列,然后由运行时评估。 Bind 只是让我们在 IO monad 中以正确的顺序对事物进行排序——然后编译器会将所有这些排序的世界修改 Action 转换为命令式代码,从而改变机器的状态。

    不过,这对于 IO monad 来说是非常具体的,而不是一般的 monad。

    关于haskell - 关于 Haskell 中 monad 的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1621337/

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