gpt4 book ai didi

haskell - Haskell 是否有类似于后期绑定(bind)的东西(或者,我们可以更改正在进行的 Haskell 程序的功能定义)吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:06 26 4
gpt4 key购买 nike

AFAIK,这是 LISP 方言的一个标志性特征:例如,假设我们启动一个正在进行的 LISP 程序,该程序重复调用某个名为 func 的函数。然后我们可以进入 lisp REPL,更改 func 的定义,然后程序下次调用 func 时,程序的行为将现场适当更改。

我相信此属性称为后期绑定(bind),但我不确定我是否正确。

后期绑定(bind)的好处是它允许您在程序仍在运行时重构甚至完全更改程序。这在生物学上类似于这样一个事实,即随着年龄的增长,在足够长的时间范围内,我们 body 中几乎每个细胞都会被一个新细胞取代(当然我们永远不会注意到)。它可以使系统非常灵活。

问题:有什么方法可以在 Haskell 中做类似的事情吗?如果 Haskell 不允许这样做,是否有充分的理由这样做(即,它是否做出了一些更大的权衡,使这一切都值得)?

最佳答案

理解声明式编程的一个好方法是将其视为永恒的。所以没有“下一次程序调用func”。如果程序在某些低级操作意义上“下一次”表现不同,这将违反纯度。当我们走出程序时,将我们的 FP 彩色镜片牢牢固定在适当的位置,我们注意到您不能“更改 func 的定义”,而是您正在做的是用func 的不同定义。因此,当您“更改 func 的定义”时,您所说的实际上是放弃当前程序并运行一个新程序。有一些 Haskell 库就是这样工作的,例如 halivedyre .

IO monad 确实让我们对“之前”和“之后”进行建模,因此在其中,我们可以谈论“改变”某些东西。更改“the”程序仍然存在与上述相同的问题,但我们当然可以拥有一个包含我们更新的一堆代码的引用单元格。实际上,这就是 Lisp(的简单实现)中正在发生的事情。您实际上可以手动执行此操作,例如定义一个 IORefMVar 来保存您要更改的函数并根据需要对其进行更新。现在的问题是你通常想要更新到全新的功能,所以我们需要有一种方法来描述新功能或动态加载功能。前者对应于有一个口译员,名义上是什么 hintmueval做(尽管它们实际上更像下面这样工作)。执行后者是动态代码加载和库,如 plugins , rts-loader , 和 dynamic-loader这样做。

或者,您可以认为(或实际构造它)部分代码作为协进程运行。此时,您可以使用标准的 IPC 机制。在这种情况下,“调用函数”仅意味着发送一条消息。

最终,这些都无法提供像 Lisp 这样的体验。 Haskell 语言本身不提供“存储”定义然后可以更新的“位置”的机制或概念。同样,从概念上讲,在 Lisp 中,每个定义都存储在一个可变单元格中,每个函数调用首先取消引用该可变单元格以获取当前定义。结果是,我提到的每个库和技术都要求您提前计划更改点所在的位置或要重新加载的内容,或者至少要重新加载的内容。没有“附加”到正在运行的 Haskell 进程或“闯入”调试器的概念。不过,从技术上讲,使用 dyre 所使用的技术,您可以重新启动一个用完全不同的语言编写的可执行文件,更不用说任意更改的 Haskell 可执行文件了。

关于haskell - Haskell 是否有类似于后期绑定(bind)的东西(或者,我们可以更改正在进行的 Haskell 程序的功能定义)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40433535/

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