gpt4 book ai didi

haskell - "effectful"到底是什么意思

转载 作者:行者123 更新时间:2023-12-03 09:23:30 24 4
gpt4 key购买 nike

我一次又一次地阅读了“有效”这个词,但我仍然无法明确定义它的含义。我假设正确的上下文是有效的计算,但我也看到了有效的术语 values )

我曾经认为有效意味着有副作用。但是在 Haskell 中没有副作用(在某种程度上 IO 除外)。仍然到处都有有效的计算。

然后我读到 monad 用于创建有效的计算。我可以在 State 的上下文中理解这一点。单子(monad)。但我在 Maybe 中没有看到任何副作用单子(monad)。一般来说,在我看来,包装类似函数的东西的 Monad 比只包装一个值的 Monad 更容易被视为产生副作用。

说到Applicative仿函数我更迷茫了。我总是将应用仿函数视为 map 的一种方式具有多个参数的函数。我在这里看不到任何副作用。或者有效果和有效果之间有区别吗?

最佳答案

一个 side effect是与其环境的可观察交互(除了计算其结果值)。在 Haskell 中,我们努力避免具有这种副作用的函数。这甚至适用于 IO行动:当 IO评估 Action ,不执行副作用,仅当 IO 中规定的 Action 时才执行。值在 main 内执行.

但是,当使用与组合计算相关的抽象时,例如应用仿函数和单子(monad),在某种程度上区分实际值和“剩余”是很方便的,我们通常称之为“效果”。特别是,如果我们有一个类型 fkind * -> * ,然后在 f a a一部分是“值(value)”,而“剩下的”就是“效果”。

我故意引用了这些术语,因为没有精确的定义(据我所知),它只是一个口语定义。在某些情况下,根本没有值,或者有多个值。例如 Maybe “效果”是对于 [] 可能没有值(并且计算被中止)。 “效果”是有多个(或零)值。对于更复杂的类型,这种区分可能更加困难。

“效果”和“值(value)”之间的区别并不真正取决于抽象。 Functor , ApplicativeMonad只需给我们工具,我们可以用它们做什么(Functor 允许修改内部值,Applicative 允许组合效果,Monad 允许效果依赖于先前的值)。但在 Monad 的上下文中s,创建一个正在发生的事情的心理画面稍微容易一些,因为单子(monad) Action 可以“看到”先前计算的结果值,正如

(>>=) :: m a -> (a -> m b) -> m b

运算符:第二个函数接收 a 类型的值,所以我们可以想象“之前的计算产生了一些影响,现在有了它的结果值我们可以做一些事情”。

关于haskell - "effectful"到底是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33386622/

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