【问题标题】:Haskell: Understanding side-effects in functionsHaskell:了解函数的副作用
【发布时间】: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


【解决方案1】:

尝试运行这个程序:

x = 5
x = 7

它会显示:

    Multiple declarations of ‘x’
    Declared at: main.hs:1:1
                 main.hs:2:1
  |
2 | x = 7

这意味着,haskell 中的variables 具有与其他语言不同的含义和概念以及明显的行为。你绑定值,等式右边的值(因为=是声明等式,和其他语言的=不一样,比如在内存中分配值,给内存指针因此您可以更改它或访问它)绑定到左侧的值。并且 Haskell 中的值是纯的,x 在程序的所有执行过程中具有完全相同的值,永远不会改变。

全局变量访问是外部影响,

是的,x 是全局的,但这是范围的问题,我可以这样做:

x = 5

f = \x -> 6 + x

然后

&> x
&> 5
&> y 4
$> 10

在这一点上不要混淆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多