我一遍又一遍地读到有效一词,但是我仍然无法清楚地定义它的含义。我认为正确的上下文是有效的计算,但是我也看到过有效的术语values)

我曾经认为有效是指产生副作用。但是在Haskell中没有副作用(在一定程度上除外IO)。仍然到处都有有效的计算。

然后,我读到monad用于创建有效的计算。我可以在State Monad的上下文中对此有所了解。但是我看不到Maybe monad有任何副作用。总的来说,在我看来,包裹类函数的Monad比起包裹值的Monad更容易产生副作用。

当谈到Applicative函子时,我甚至迷失了。我一直把应用函子看作是对一个带有多个参数的函数map的一种方法。我在这里看不到任何副作用。还是有效果和有效果之间有区别?

最佳答案

side effect是与其环境可观察到的交互(除了计算其结果值之外)。在Haskell中,我们努力避免具有此类副作用的功能。这甚至适用于IO Action :在评估IO Action 时,不会执行任何副作用,只有在IO内执行main值中指定的 Action 时才执行副作用。

但是,在处理与组成计算有关的抽象时,例如应用函子和monad,可以方便地在实际值和“剩余”之间进行区分,我们通常将其称为“效果”。特别是,如果我们的f类型为kind * -> *,则在f aa部分为“值”,而“剩余”为“效果”。

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

“效果”和“值”之间的区别实际上并不取决于抽象。 FunctorApplicativeMonad只是为我们提供了我们可以使用它们的工具(Functor允许修改内部值,Applicative允许组合效果,而Monad允许效果取决于先前的值)。但是在Monad s的上下文中,创建一个关于正在发生的事情的心理图要容易些,因为单调 Action 可以“看到”先前计算的结果值,如

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

运算符:第二个函数接收到类型为a的值,因此我们可以想象“先前的计算产生了作用,现在有了可以执行某些操作的结果值”。

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

10-15 21:01