Functional programming 用线程模拟副作用

Functional programming 用线程模拟副作用,functional-programming,Functional Programming,我在看第九频道的演讲,在大约60分钟的节目中,有一个非常有趣的发言 他说,即使使用完全纯函数,一旦引入线程,也可以模拟副作用 他概述这一点的方式是使用C-omega符号,我不熟悉,这已经有了相关的语言支持 我的问题是如何在没有赋值的情况下实现get和set消息处理程序?当然,处理程序必须更改一个值,以便线程的内部循环可以记录一个新值 我错过了什么?例如,在没有特殊构造的LISP中,我将如何实现这一点 我的问题是如何在没有赋值的情况下实现get和set消息处理程序?当然,处理程序必须更改一个值,以

我在看第九频道的演讲,在大约60分钟的节目中,有一个非常有趣的发言

他说,即使使用完全纯函数,一旦引入线程,也可以模拟副作用

他概述这一点的方式是使用C-omega符号,我不熟悉,这已经有了相关的语言支持

我的问题是如何在没有赋值的情况下实现get和set消息处理程序?当然,处理程序必须更改一个值,以便线程的内部循环可以记录一个新值

我错过了什么?例如,在没有特殊构造的LISP中,我将如何实现这一点

我的问题是如何在没有赋值的情况下实现get和set消息处理程序?当然,处理程序必须更改一个值,以便线程的内部循环可以记录一个新值

是的,你是对的。Erik假设每个线程都有自己的消息队列。发送带有
值(n)
的消息显然会更改消息队列的状态。他让这听起来比实际情况更神秘:他只是在用任务交换另一种形式的可变状态。他利用了语言的“先决条件”特性,使其语法清晰


正如他所说,您可以使用传统IO(他提到了控制台IO)来做同样的事情。设想
Value(n)
n
写入文件,前提条件
Value(T)
检查状态的当前值是否为
T
(在文件中)。瞧,没有赋值的可变状态(但现在涉及IO!)。

模拟副作用的目的是什么?另外,C-Omega是微软的一个研究项目,现在已经不存在了。C-Omega的一些想法进入了C#,其中一些没有。如果我正确理解“模拟副作用”,Haskell会使用单子,特别是IO单子来实现这一点。IO Monad允许纯函数式编程,同时仍然允许与外部世界进行交互(被认为是一种副作用)。@Robert-目的只是为了证明,一旦引入线程,在语言中完全不允许有任何副作用对你没有好处。我的问题背后没有实际的原因——这更多的是一个理论问题。我发现有趣的是,埃里克在视频中从未使用过“可变”或“不变”这两个词,甚至一次也没有。他还设法避免在描述功能纯度时使用“封装”一词,声称你只能是纯的或不纯的,不能两者兼而有之。是的,他确实让事情变得更加神秘。也许是因为他是个学者。