gpt4 book ai didi

functional-programming - 纯函数式编程是否可能产生副作用

转载 作者:行者123 更新时间:2023-12-02 17:43:43 26 4
gpt4 key购买 nike

我已经尝试了解函数式编程有一段时间了。我查阅了 lambda 演算、LISP、OCaml、F# 甚至组合逻辑,但我遇到的主要问题是 - 如何做需要副作用的事情,例如:

  • 与用户互动,
  • 与远程服务通信,或者
  • 使用随机采样处理模拟

不违反纯函数式编程的基本前提,即对于给定的输入,输出是确定性的?

我希望我说得有道理;如果没有,我欢迎任何帮助我理解的尝试。提前致谢。

最佳答案

大多数现实世界的函数式编程在大多数意义上都不是“纯粹的”,所以你的问题的一半答案是“你通过放弃纯粹来做到这一点”。也就是说,有替代方案。

在纯粹的“最纯粹”意义上,整个程序代表一个或多个参数的单个函数,返回一个值。如果你眯起眼睛并稍微挥挥手,你可以声明所有用户输入都是函数“参数”的一部分,所有输出都是“返回值”的一部分,然后稍微捏造一些东西,这样它就只会做“按需”实际 I/O。

类似的观点是声明函数的输入是“外部世界的整个状态”,并且评估函数返回一个新的、修改过的“世界状态”。在这种情况下,程序中使用世界状态的任何函数显然都不再是“确定性”的,因为程序的两个评估不会具有完全相同的外部世界。

如果您想用纯 lambda 演算(或类似的语言,例如深奥的语言 Lazy K)编写交互式程序,从概念上讲,您就是这样做的。

用更实际的术语来说,问题归结为确保当输入用作函数的参数时 I/O 以正确的顺序发生。这个问题的“纯粹”解决方案的一般结构是函数组合。例如,假设您有三个执行 I/O 的函数,并且您希望按特定顺序调用它们。如果您执行类似 RunThreeFunctions(f1, f2, f3) 的操作,则无法确定它们的计算顺序。另一方面,如果您让每个函数采用另一个函数作为参数,你可以像这样链接它们:f1( f2( f3())),在这种情况下,你知道 f3 将首先被评估,因为 f2 的评估 取决于它的值。 [编辑:另请参阅下面有关惰性评估与热切评估的评论。这很重要,因为惰性求值实际上在非常纯粹的上下文中很常见;例如,纯 lambda 演算中递归的标准实现在急切求值下是不会终止的。]

同样,要在 lambda 演算中编写交互式程序,您可能会这样做。如果您想要一些实际可用于编程的东西,您可能希望将函数组合部分与函数的概念结构结合起来,函数获取和返回代表世界状态的值,并创建一些高阶抽象来处理管道化“I/O 函数之间的“世界状态”值,理想情况下还保持包含“世界状态”以强制执行严格的线性 - 此时您几乎重新发明了 Haskell 的 IO Monad。

希望这不会让您更加困惑。

关于functional-programming - 纯函数式编程是否可能产生副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1916692/

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