在功能性编程书中,作者提到以下是副作用。
我只是想知道如果它们是副作用,如何编写纯函数程序而不读取或写入文件是可能的。如果是,那么在功能世界中实现这一目标的常用方法是什么?
谢谢, 穆罕默德
答案 0 :(得分:5)
正确回答此问题可能需要整本书(不太长)。这里的重点是函数式编程旨在将逻辑描述/表示与其实际的运行时解释分开。您的功能代码只是将程序的效果表示为(不运行)为值,从而为您提供了某种抽象的语法树来描述您的计算。您代码的不同部分(通常称为解释器)将采用这些值并懒惰地运行实际效果。那部分不起作用。
如何编写以任何方式都有用的纯函数程序?这不可能。纯粹的功能程序只会加热CPU。它需要实际写入磁盘或网络的不纯部分(解释器)。 There are several important advantages in doing it that way。纯函数部分易于测试(测试纯函数很容易),纯函数的referentially transparent性质使reason about your code locally易于实现,从而使整个开发过程的bug更少且生产率更高。它还提供了elegant ways to deal with traditionally obfuscated defensive code。
那么功能界实现副作用的常用方法是什么?如前所述,使用值表示它们,然后编写解释这些值的代码。 in these blog post series对整个过程有很好的解释。
答案 1 :(得分:3)
为了简洁起见,让我(简化)简化并简化长篇故事:
处理"副作用"在纯粹的函数式编程中,你(程序员)从输入到输出编写纯函数,系统通过将这些纯函数应用到现实世界来产生副作用。
例如,要读取整数x
并写x+1
,您(粗略地说)编写函数f(x) = x+1
,系统将其应用于实际输入并输出其返回值值。
另一个例子,您的纯函数返回一个表示异常的特殊值,而不是将异常作为副作用引发。各种" monads"例如Haskell中的IO
概括了这些想法,即用纯函数表示副作用(当然,实际的实现更复杂)。