"如何运行函数式编程语言?"

31 浏览
0 Comments

"如何运行函数式编程语言?"

如果函数式编程语言不能保存任何状态,它们如何执行简单的任务,比如从用户那里读取输入?它们如何“存储”输入(或存储任何数据)?

举个例子:这个简单的 C 代码在函数式编程语言如 Haskell 中怎么翻译呢?

#include
int main() {
    int no;
    scanf("%d",&no);
    return 0;
}

(我的问题受到这篇优秀文章的启发:“名词王国中的执行”。阅读它让我更好地理解了面向对象编程的本质是什么,Java 如何在一种极度的方式中实现它,以及函数式编程语言的对比。)

admin 更改状态以发布 2023年5月20日
0
0 Comments

这里有很多好的答案,但都很长。我将尝试给出一个有用的简短答案:

  • 函数式语言将状态放在与 C 相同的位置:在命名变量和在分配在堆上的对象中。区别在于:

    • 在函数式语言中,“变量”在进入作用域时(通过函数调用或 let-binding)获得其初始值,并且该值之后不会改变。同样,分配在堆中的对象会立即初始化为其所有字段的值,之后不会再改变。

    • 对“状态更改”的处理不是通过改变现有变量或对象来完成,而是通过绑定新变量或分配新对象来完成。

  • IO 是通过一种诡计实现的。产生字符串的副作用计算由以 World 为参数的函数描述,并返回包含字符串和新 World 的一对值。World 包括所有磁盘驱动器的内容、每个发送或接收的网络数据包的历史记录、屏幕上每个像素的颜色等等。诡计的关键在于对 World 的访问被仔细限制,以便:

    • 没有程序可以复制 World(你该放哪里?)

    • 没有程序可以丢弃世界

    使用这个诡计,可以有一个唯一的 World,它的状态随时间演变。这种语言运行时系统(不是用函数式语言编写的)通过在原地更新唯一的 World 来实现副作用计算,而不是返回一个新 World。

    这个诡计在 Simon Peyton Jones 和 Phil Wadler 的标志性论文“命令式函数式编程”中得到了精美的解释。

0