在Haskell中打印是一个纯函数; 为什么或者为什么不?我认为这不是因为它并不总是返回与纯函数应该相同的值.
我试图从第一原则来理解函数式编程,但我仍然停留在纯函数世界和具有状态和副作用的不纯现实世界之间的接口上。从数学的角度来看,
详细说明:在我的理解中,纯函数是从域到共域的映射。最终,它是从计算机内存中的某些值到内存中的某些其他值的映射。在函数式语言中,函数是声明式定义的;即,它们描述了映射,但不描述需要对特定输入值执行的实际计算;后者由编译器来推导。在具有空闲内存的简化设置中,运行时将没有计算;相反,编译器可以在编译时为每个函数创建一个查找表。执行一个纯程序相当于查表。因此,组合函数相当于构建更高维的查找表。当然,拥有计算机的全部意义在于设计出无需逐点查找表即可指定函数的方法 - 但我发现心智模型有助于区分纯函数和效果。但是,我很难将这种心智模型应用于高阶函数:
现在到令人讨厌的现实世界。与它的交互并不纯粹,但没有它,就没有合理的程序。在我上面的简化心智模型中,分离程序的纯部分和不纯部分意味着每个函数式程序的基础是一层命令式语句,这些语句从现实世界中获取数据,对其应用纯函数(进行查表),以及然后将结果写回现实世界(磁盘、屏幕、网络等)。
在 Haskell 中,这种与现实世界的命令式交互被抽象为IO 操作,编译器根据它们的数据依赖性对它们进行排序。但是,我们不会直接将程序编写为一系列命令式 IO 操作。相反,有些函数会返回 IO 操作(类型为 的函数:: IO a
)。但据我所知,这些不可能是真正的功能。这些是什么?如何根据上面概述的心智模型最好地思考它们?
io haskell functional-programming purely-functional higher-order-functions