有没有任何纯粹的功能方案或Lisps?

时间:2010-05-23 01:01:54

标签: haskell functional-programming scheme referential-transparency

我使用过一些函数式编程语言,并且非常喜欢Lisps使用的s-expr语法(特别是Scheme)。

我也看到了使用纯函数式语言的优势。因此:

是否有任何纯功能方案(或一般的Lisps)?

9 个答案:

答案 0 :(得分:24)

新的Racket语言(以前称为PLT Scheme)允许您使用s表达式(实际上是任何语法)实现您喜欢的任何语义。基本语言是一种急切评估的,动态类型的方案变体,但在顶部构建的一些值得注意的语言是惰性方案和称为父亲时间的功能反应系统。

在Racket中制作纯函数语言的一种简单方法是采用基本语言,而不是提供任何改变状态的过程。例如:

#lang racket/base
(provide (except-out (all-from-out racket/base) set! ...more here...))

组成一种没有set!的语言。

答案 1 :(得分:14)

我不相信有任何纯粹的功能性Lisps,但Clojure可能是最接近的。

Rich Hickey,Clojure的创造者:

  

为什么我要编写另一种编程语言?   基本上是因为我想要一个用于功能编程的Lisp   专为并发而设计,找不到。

http://clojure.org/rationale

Clojure是可用的,具有不可变的数据类型和变量,但是在某些特殊情况下或者通过下拉到Java(Clojure在JVM上运行)可以获得可变行为。

这是设计 - Rich的另一个引用是

  

纯粹的函数式编程   语言只适合加热你的   计算机。

请参阅presentation of Clojure for Lisp programmers

答案 2 :(得分:13)

  

是否有任何纯粹的功能方案(或一般的Lisps)?

ACL2 theorem prover是纯粹的Lisp。然而,它用于定理证明而不是编程,特别是它仅限于一阶程序。然而,它在其利基市场上取得了极大的成功。 除此之外,它赢得了2005年ACM Software System Award

答案 3 :(得分:12)

可能不是,至少不是玩具/概念证据之外的任何东西。请注意,即使Haskell也不是100%纯粹的功能 - 它具有秘密逃生舱,IO中的任何内容都是only "pure" in some torturous, hand-waving sense of the word

那就是说,你真的需要纯粹的功能性语言吗?您几乎可以用任何语言编写纯函数式代码,并且会带来不同程度的不便和低效率。

当然,承担普遍状态修改的语言会让保持纯粹的东西变得痛苦,所以也许你真正想要的是一种鼓励不变性的语言?在这种情况下,你可能会发现值得看一下Clojure的哲学。这是一个Lisp,要启动!

作为最后一点,请注意Haskell的大部分“语法”都是厚厚的糖层。底层语言只不过是一个类型化的lambda演算,并没有什么能阻止你以这种方式编写所有代码。不过,你可能会从其他Haskell程序员那里得到有趣的外观。还有Liskell但我不确定这些日子里的状态是什么。

最后,实际的注意事项:如果你想真正编写你想要使用的代码,而不仅仅是修补一些有趣的东西,你真的想要一个知道如何工作的聪明的编译器使用纯代码/不可变数据结构。

答案 4 :(得分:5)

  

不一致且不可扩展的语法

这里的“不一致”是什么?

基于语法选择语言是很奇怪的。毕竟,学习语法需要几个小时 - 这只是所需投资的一小部分。

相比之下,重要的考虑因素,如速度,打字规则,可移植性,图书馆的广度,文档和社区,对您是否能够提高工作效率影响更大。

忽略所有火焰诱饵,快速google for immutable Scheme会产生一些结果: http://blog.plt-scheme.org/2007/11/getting-rid-of-set-car-and-set-cdr.html

答案 5 :(得分:5)

30年前有lispkit lisp 不知道今天有多容易接近。
[那是我学习函数式编程的地方之一]

答案 6 :(得分:4)

owl lisp,方案R5RS的方言,所有数据结构都是不可变的,还有一些额外的纯数据结构。它不是一个大项目,但似乎是由一小群人积极开发和使用(从我在网站和git存储库中看到的)。还计划包括R7RS支持和某种类型推断。因此,虽然可能还没有为生产使用做好准备,但这可能是一件有趣的事情。

答案 7 :(得分:3)

如果您喜欢lisp的语法,那么您实际上可以在Haskell中执行类似的操作

let fibs = ((++) [1, 1] (zipWith (+) fibs (tail fibs)))

let fibs =放在一边。您始终可以在Haskell表达式中使用s-expr语法。这是因为你总是可以在外面添加括号,这无关紧要。这是没有多余括号的相同代码:

let fibs = (++) [1, 1] (zipWith (+) fibs (tail fibs))

这是“典型的”Haskell风格:

let fibs = [1, 1] ++ zipWith (+) fibs (tail fibs)

答案 8 :(得分:3)

有几个项目旨在在lispy语法下使用haskell。较老的,令人沮丧的,更笨重的是“Liskell”。更新,更活,更轻的重量是hasp。我想你可能会觉得值得一看。