haskell - 从语言实现的角度来看,函数式语言有何不同

标签 haskell functional-programming lisp ml

存在“函数式编程”的全新范式,与过程式编程相比,它需要彻底改变思维模式。它使用高阶函数、纯度、monad 等,这些在命令式和面向对象的语言中通常是看不到的。

我的问题是这些语言的实现与命令式或面向对象的语言有何不同,例如,在内存管理或指针等内部结构方面。

有些函数式语言运行在 JVM 之上。这是否意味着这些语言在内部与 JVM 上的其他语言一样工作?

最佳答案

函数式语言生成的代码使用了您在非函数式语言中不同程度看到的许多特性。垃圾收集已进入普遍使用。尾调用优化是 done in GCC and VC++ .

然而,闭包是函数式编程的标志。你看不到一个没有另一个。如果您将“函数式语言”定义为仅指纯函数式语言,那么这两者并不是同义词,因为您会在支持函数式编程的命令式语言中找到闭包(例如 Javascript 和 Scheme(这在技术上是命令式的,尽管函数式范式是最主要的用过的))。闭包可以用 spaghetti stack 来实现对于调用堆栈,或者通过在退出堆栈帧时复制出局部变量,或者通过在堆上分配局部变量并让垃圾收集来处理它们。

一旦有了闭包,匿名函数就相对容易了(有了解释器,它们真的很容易)。使用编译器,函数在编译时转换为字节码,字节码(而不是入口点的地址)在运行时与当前环境相关联。

函数组合可以依赖匿名函数。当编译器遇到函数组合运算符 f 时。 g,它创建一个调用两个参数 fg 的匿名函数,将其中一个的结果作为参数传递给另一个。

Monad 可以用 OO 语言实现,只是不像在纯函数式语言中那么必要。 I/O monad 并没有什么特别的,它们只是依赖于底层平台允许副作用这一事实。

关于haskell - 从语言实现的角度来看,函数式语言有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1857083/

相关文章:

haskell - 简单的随机数生成

haskell - "Mapping"扫描

linux - Haskell 32 到 64 位交叉编译

haskell - 单子(monad)和 ZipList 以外的应用仿函数?

web - 什么是 restas 渲染对象?

haskell - 如何读取这个GHC核心 "proof"?

scala - 验证数字序列是否在允许的范围内

scala - scala、zip 中的嵌套序列迭代

list - 如何在 Common Lisp 中从现有列表中设置某些内容

lisp - 嵌入式方案解释器