我对更好地学习函数式编程感兴趣。为此,看来我应该强迫自己使用最纯净的函数式编程语言。因此,我在这里或多或少地要求根据功能性编程语言的纯度对其进行排序。
在我看来,学习Lisp或Clojure(或Scheme或Scala等)会更加实用,但是就我最近所听到的信息而言,Haskell在向某人教授函数式编程原理方面很难被击败。我还不确定,所以我问你:哪一种是最纯粹的函数式编程语言?如果有几个人争夺最纯粹的函数式编程语言的宏伟标题,那么排序将是很棒的。
我对更好地学习函数式编程感兴趣。为此,看来我应该强迫自己使用最纯净的函数式编程语言。因此,我在这里或多或少地要求根据功能性编程语言的纯度对其进行排序。
在我看来,学习Lisp或Clojure(或Scheme或Scala等)会更加实用,但是就我最近所听到的信息而言,Haskell在向某人教授函数式编程原理方面很难被击败。我还不确定,所以我问你:哪一种是最纯粹的函数式编程语言?如果有几个人争夺最纯粹的函数式编程语言的宏伟标题,那么排序将是很棒的。
Answers:
没有用于评估功能语言纯净程度的量表。如果语言允许副作用,那是不纯的,否则就是纯粹的。根据这个定义,Haskell,Mercury,Clean等都是纯函数式语言;而Scala,Clojure,F#,OCaml等是不纯洁的。
编辑:也许我应该这样说:“如果语言在不让类型系统知道的情况下不允许出现副作用,那是纯粹的。否则就是不纯净的。”
IO
monad)。只是将导致副作用的代码清楚地标记为这样。我认为完全不讲纯净/不纯洁的语言是没有用的(Haskell让您必须进行编程!加斯普!),但将代码块(函数,模块,程序等等)讲纯净仍然有用。 /不纯。
IO
monad 是纯净的。它不是运行时库,不是您的代码,因为您的main
函数基本上是一个巨大的状态转换器。(有点像main :: World -> World
幕后花絮)
program = "some C code"
,然后运行时环境处理C代码。:-)
由于学习是您的目标,而不是自己编写程序,所以没有比Lambda Calculus更纯净的了。
Lambda微积分技术是在计算机发明之前就出现的。需要一些熟练的逻辑学家来研究如何进行减法(理论上有一段时间,只有加法和乘法才是可能的)。
学习布尔值和数字,以及如何if
从看似没有的发明中发现布尔值和数字,并不会在您的油箱中放更多的汽油,但这会使您的油箱更大。
-1
。
不纯净的语言在原理上与更熟悉的指令式语言并没有真正的区别,特别是现在已经复制了许多功能技巧。风格不同-解决问题的方式。
无论您是将Haskell视为纯元素,还是将IO monad视为杂质,Haskell样式都是这种样式的一种极端形式,值得学习。
Haskell IO monad源自(当然)monad的数学理论。但是,对于命令式程序员来说,我认为倒退的方式到达monad更有意义。
第一阶段-一种纯函数式语言可以轻松地返回一个大字符串值作为结果。这个大字符串可以是命令式程序的源代码,它是从某些需求指定参数以纯功能方式导出的。然后,您可以构建一个运行代码生成器的“高级”编译器,然后将生成的代码自动送入命令式语言编译器。
第二阶段-您将生成一个强类型抽象语法树,而不是生成文本源代码。您的命令式语言编译器被“高级”编译器所吸收,并直接接受AST作为源代码。这与Haskell所做的非常接近。
但是,这仍然很尴尬。例如,您有两种截然不同的函数-在代码生成阶段评估的函数和在生成的程序运行时执行的函数。有点像C ++中函数和模板之间的区别。
因此,对于阶段3,使两者相同-具有相同语法的相同函数可以在“代码生成”过程中部分评估,或者完全评估,或者根本不评估。进一步,丢弃所有循环构造AST节点,以利于递归。实际上,将AST节点的想法完全丢弃为一种特殊的数据-不具有“文字价值”的AST节点,而仅具有值等。
这几乎是IO monad所做的-绑定运算符是一种构成“动作”以形成程序的方式。没什么特别的-只是一个功能。在“代码生成”过程中可以评估许多表达式和函数,但是那些依赖I / O副作用的表达式和函数必须将评估推迟到运行时-不受任何特殊规则的限制,而是由于数据依赖关系的自然结果。表达式。
通常,Monad只是一般化-它们具有相同的接口,但实现抽象操作的方式有所不同,因此,它们不评估命令式代码的描述,而是评估其他内容。具有相同的界面意味着您可以对monad进行某些操作,而无需关心哪个monad,这很有用。
这种描述无疑会使纯粹主义者大开眼界,但是对我来说,它解释了Haskell之所以有趣的一些真实原因。它模糊了编程和元编程之间的界限,并使用功能性编程工具来重新设计命令式编程,而无需特殊的语法。
我对C ++模板的批评是,它们是命令式语言中一种破碎的纯函数子语言-要在编译时而不是在运行时评估相同的基本功能,您必须使用完全不同的样式重新实现它编码。在Haskell中,虽然杂质必须按其类型进行标记,但可以在同一程序中的元编程意义上和运行时非元编程意义上评估完全相同的功能-没有硬性规定在编程和元编程之间。
就是说,有些Haskell无法做一些元编程的事情,主要是因为类型(也许还有其他一些东西)不是一流的值。但是,有一些语言变体试图解决这个问题。
我对Haskell所说的很多事情都可以用在不纯函数语言中,甚至有时甚至是祈使语言中。Haskell有所不同,因为您别无选择,只能采用这种方法-它基本上迫使您学习这种工作方式。您可以“用ML编写C”,但不能“用Haskell编写C”-至少要在不了解引擎盖底层的情况下才能做到。
我个人将语言分为三种功能纯度:
纯函数式语言 -即那些将整个程序视为纯函数并仅通过与运行时交互来处理可变性的语言-Haskell可能是典型的示例
不正确的功能语言 -即那些强调功能样式但允许副作用的语言。Clojure显然属于这一类(它作为STM框架的一部分,允许以受控方式进行突变),也包括OCaml或F#
多范式语言 -这些不是最重要的功能语言,但是可以通过使用一流的函数等来支持功能样式。Scala是一个很好的例子,我也将Common Lisp归入此类,您甚至可以包括像JavaScript这样的语言。
根据您的情况,建议您先学习Haskell,然后再学习Clojure。这就是我所做的,对我来说非常有效!Haskell非常漂亮,可以教给您最纯粹的功能原理,Clojure更加务实,可以帮助您完成很多工作,同时仍能发挥很多功能。
我并没有把第三类算作功能语言(尽管在学习了Haskell和Clojure之后,我经常发现自己在使用它们时会利用功能技术!)
Erlang,Haskell,Scheme,Scala,Clojure和F#
这个问题将可能是最好的,你帮助你在你的搜索为好。
set!
(除其他外)...