gpt4 book ai didi

haskell - ghci 重新分配

转载 作者:行者123 更新时间:2023-12-02 02:55:45 25 4
gpt4 key购买 nike

是否可以在 ghci 中重新分配相同的变量?当然,这在普通 Haskell 中是不可能的(至少在没有 IORef 之类的情况下),但我很好奇,因为 ghci 中的 it 变量是通过启用 :m选项。启用此功能后,我得到了这样的体验:通过将下一个表达式绑定(bind)到任何东西,it可以有效地重新分配,例如

λ> 1 + 1
2
it :: Num a => a
λ> it
2
it :: Num a => a
λ> it + 1
3
it :: Num a => a
λ> it
3
it :: Num a => a

有没有办法对任意命名变量实现相同的效果,而不仅仅是特殊的it

最佳答案

GHCi 中的每个新行都会进入新的嵌套范围。考虑一下

> x = 1
> x
1
> foo y = x + y
> foo 41
42
> x = 7 -- new x
> x
7
> bar y = x + y -- refers to new x
> bar 41
48
> foo 41 -- still refers to the same old x binding
42

x 的第二个绑定(bind)定义了新的同名变量。

自然地,它隐藏该名称的先前绑定(bind),使其本身无法访问。不过,之前引用过它的任何其他实体(如 foo )将继续保留该引用,无论新嵌套的阴影如何环境。

这遵循 Haskell 中值不变性的原则:foo 保持不变。

一个警告:

> :{
x = 1
foo y = x + y
x = 7 -- error: conflicting definition
bar y = x + y
:}

会导致错误,因为以多行模式输入的行属于同一范围。

换句话说,你的问题的答案是,这会破坏Haskell 的基本纯度属性。

it 也不会重新分配,它会在每个新的嵌套环境中重新定义,只要有任何输出,就会绑定(bind)到输出值:

> x
7
> it
7
> it_2 -- made a typo

error: Not in scope: `it_2'
> it+2 -- no previous output, same `it` in effect
9
> it+2 -- most recent `it` is 9
11

因此,您始终可以隐藏变量并创建具有相同名称的新绑定(bind),但无法更改旧绑定(bind),因为它现在已成为历史的一部分,而过去可以根据定义,不能改变。它已经发生了

或者你可以创建自己的 Haskell 解释器,让用户能够“更改”旧绑定(bind),但真正发生的情况是,即使“正在播放”也会生成解释器的新副本“从那时起,在提示下记录的所有用户操作 - 新定义和所有内容。然后,用户最终会得到一个更改后的副本,而不会注意到第一个副本的存在。那时你甚至可以杀死原版。这是否可以被视为用户改变了过去? 用户的过去没有改变,他们的时间在前进。就而言,新副本的过去始终是现在的样子。旧的原件(副本?)已经消失了......一个需要思考的问题。

关于haskell - ghci 重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61189188/

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