【发布时间】:2019-07-25 22:57:39
【问题描述】:
我正在学习 Haskell 中的 IO 以及函数中的副作用。我知道外部效应是在函数之外可以观察到的效应,而内部效应是从外部看不到的。我的理解是,外部影响会改变超出功能范围的“现实世界”。
全局变量访问是外部影响,因为它们在函数外部可见。但是,修改局部变量是否会被视为内部影响?我相信由于这些局部变量只能在函数本身内访问,因此对它们进行更改不会影响“现实世界”,因此这不会被视为内部影响。
但是,我不确定我的推理是否正确。任何见解都值得赞赏。
【问题讨论】:
-
Haskell 根本不允许你修改变量——这是纯语言的一部分。
-
有些库允许从外部不可见的“本地可变状态”(
ST),但这是一个相当奇特的东西,不常用。首先尝试理解IO更容易,它总是将副作用暴露给外部,即使它们可能是“本地的”而不是真正可观察的。 -
所以在纯度方面,我说得对,改变一个变量的值,不管它是局部的还是全局的,都会被认为是一种效果?
-
在 Haskell 中不能修改变量。您可以读取和修改某些状态,例如使用
IORefs,这将被视为IO效果。同样,读取或修改STRef将是ST效果。但是,IO会影响整个程序的“传播”:例如,您不能在函数Int -> String中使用IO(您需要Int -> IO String,公开IO)。相反,ST效果可以设置为“本地”,因此即使在Int -> String类型的函数中也可以使用它们。
标签: haskell functional-programming