柯里化的前生今世(九):For Great Good

关于

上文第二~八篇中,我们学习了Racket语言,它很有代表性,是一种Lisp方言。
很多概念用Racket描述会更加简便。

我们介绍了高阶函数,词法作用域,闭包以及continuation,
这些概念对理解函数式编程来说十分重要。


然而,偏见却经常起于片面。
只学习一种语言,会让我们对事物的同一个侧面产生习惯。
事实上,我们需要多样化的角度,也需要经常更换思维方式。

这对学习新知识很有帮助,
有些时候,我们理解不了某些概念,很有可能是因为这个概念被描述的不够全面,
我们经常走到深入思考这一特定描述的误区。
实际上,我们应该尝试寻找不同的描述方式,换个角度重新审视。

Haskell Curry

第一篇中,我们提到了美国著名的数学家,逻辑学家Haskell Curry,
当时我们对他的生平进行了非常详细的介绍,因为,柯里化是用Curry来命名的。
除此之外,那是因为还有一门编程语言用Haskell来命名。

Haskell是一种通用的,纯函数式编程语言,
其中包含了很多编程语言研究领域中的新概念。
Haskell提供了高阶函数,非严格语义(non-strict semantics),静态多态类型,
用户自定义的代数数据类型,模式匹配,列表解析(list comprehension),
模块系统,monadic IO系统。

Haskell包含了丰富的原始数据类型,
包括列表,数组,任意精度的整数,以及浮点数。

Haskell是非严格(non-strict)函数式语言领域多年研究的结晶。

An expression language is said to have non-strict semantics if expressions can have a value even if some of their subexpressions do not

历史

1987年9月在美国俄勒冈州的波特兰,
举行了一次关于函数式编程语言和计算机体系结构的会议,FPCA'87。
会议看到了函数式编程社区的现状,
社区中已经出现了十几个非严格语义的纯函数式编程语言,
它们全都表现力丰富,而且建立在语义学基础之上。

人们看到,没有一门公共语言妨碍了这些语言的广泛使用。
于是,会议达成共识,决定设计一门新的语言,用来更快的交流新想法,
这样可以保证基础更加牢固,也可以推动实际生产环境中的使用。
对于那些想学习函数式语言的人们,也方便了许多。
这门语言就是Haskell,以逻辑学家Haskell B. Curry命名。

方法论

学习Haskell是一件困难的事情,会让你想起第一次写程序时的感觉。
它非常有趣,而且强迫你Think different。

Haskell社区中流行着这样一句话,我认为对学习非常有帮助,
Don't sweat the stuff you don't understand immediately. Keep moving!
别在不懂的地方打转,先继续读下去!

我觉得这句话说的极好,也是软件相对于其他行业的根本区别。
编程领域中的很多概念,通常会涉及尚未学到的知识点,
因此,寄希望于在遇到的那一刻去理解它,几乎是不可能的。
这就要求我们敢于放弃,先强行建立模糊的印象,等有机会不断的回来再看。

下文

Haskell有着纯正的血统,(此处应该加引号,“纯正”
这门语言是一群非常聪明的人设计的,他们每个人都有 PhD 学位,
他们聚在一起就是想设计一个吊到爆的编程语言。
to design a kick-ass language。。

下文我们准备从Haskell语言的基础概念谈起,然后循序渐进,
等熟悉之后,再来探讨Monad和Category Theory这些有趣的话题。

参考

History of Haskell
Haskell趣学指南 · GitBook
编程语言学习曲线

时间: 2025-01-20 12:43:42

柯里化的前生今世(九):For Great Good的相关文章

柯里化的前生今世(一):函数面面观

关于 本文作为开篇,介绍了出场人物,并形象化的引入了高阶函数, 得到了柯里化的概念. 后续文章,会介绍高阶函数的实现方式,词法作用域和闭包,参数化类型,类型上的柯里化, 敬请期待. 如有不同的认识,或者感兴趣的点,请直接联系我,欢迎指教. 人物介绍 球星库里 库里,Stephen Curry,1988年3月14日出生于美国俄亥俄州阿克伦(Akron, Ohio), 美国职业篮球运动员,司职控球后卫,效力于NBA金州勇士队. 斯蒂芬·库里2009年通过选秀进入NBA后一直效力于勇士队,新秀赛季入选

柯里化的前生今世(八):尾调用与CPS

关于 在上一篇中,我们介绍了continuation的概念,还介绍了Lisp中威力强大的call/cc,它提供了first-class continuation,最后我们用call/cc实现了python中的generator和yield. call/cc赋予了我们很强的表达能力,Lisp中的异常处理机制也很人性化. 例如,Common Lisp: Condition_system, 由于call/cc可以捕捉到异常处的continuation, 我们就可以手动调用这个continuation,

柯里化的前生今世(四):编译器与解释器

关于 在上一篇中,我们提到了形式语言与文法,S表达式与M表达式,同像性. 本文将开始写一个简单的解释器, 通过具体实现,我们来理解求值环境,动态作用域和静态作用域,还有闭包等概念. 当然,一篇文章来写完这些肯定是不够的,我们可以慢慢来,循序渐进. 写完了这个解释器之后,我们会增加一些新的功能. 编译器与解释器 编译器会将源代码转换成另一种语言的代码,然后在支持后一种语言的机器上执行. 而解释器则不同,它会逐行分析源代码,直接执行分析结果. 值得一提的是,编译和解释是执行代码的两种手段, 具体的语

柯里化的前生今世(十二):多态性

关于 本文借用Haskell介绍了自定义类型,带参数的类型,Ad-hoc多态性,kind, 其中,带参数的类型在类型上可以做"柯里化". 1. 自定义类型 Haskell中使用data自定义类型. data Bool = True | False 其中,Bool是类型名,True和False是该类型的值. 一个值可以包含多种不同类型的字段(field),例如, data BookType = BookValue Int String 其中BookType是类型名,BookValue是值

柯里化的前生今世(十):类型和类型系统

形式化方法 在计算机科学中,尤其在软件工程和硬件工程领域, 形式化方法(Formal method),是一种数学方法,用于软件和硬件系统的描述(specification).开发(development)和验证(verification).旨在能像其它工程学科一样,通过用数学进行分析,来提高设计的可靠性(reliability)和健壮性(robustness). 为了让系统表现的和规范(specification)一致,现代软件工程采用了一系列的形式化方法.其中包括一些强有力的框架,例如,霍尔逻

柯里化的前生今世(十一):Pure and Lazy

语言的作用 语言可以用来交流想法,描述概念, 当前使用了什么语言,取决于我们有什么样的需要. 为了理解词法作用域,闭包,和continuation, 前文中,我们借助了Racket. 现在,为了理解代数数据类型(algebraic data type),多态(polymorphism),参数化类型(parameterized type),类型类(type class),我们要学习Haskell了. 编程也是如此,它是关于思想的, 编程语言只是描述这种思想的工具罢了. 非严格语义(non-stri

柯里化的前生今世(三):语言和同像性

按照故事情节的正常发展,我们这一篇该介绍Racket语言的语法了. 可是,在大局观上,我们还没有达成共识. 对于一个概念来说,我们不止要学会怎样描述它,还要学会理解它的内涵. 因此,这篇还是在打基础,俗称,引言.. 关于 在上一篇中,我们提到了Lisp语言家族,看到了关于Lisp最美丽的传说,我们提到了Racket,以及它的IDE,DrRacket. 本文将从目标语言和元语言,同像性(Homoiconicity),引用等这些角度来深入的讨论Lisp, 浅尝辄止,毕竟不是一个好习惯. 目标语言和元

柯里化的前生今世(十三):WHNF

1. 形式系统(Formal system) 在逻辑学与数学中,一个形式系统由两部分组成,一个形式语言加上一套推理规则. 一个形式系统也许是纯粹抽象地制定出来的,只是为了研究其自身. 也可能是为了描述真实现象或客观事实而设计的. 2. λ演算(λ-caculus) λ演算用于研究函数定义.函数应用和递归,它是一些形式系统的总称, 配备不同的推理规则集,就会得到不同的演算系统. λ演算由Alonzo Church和Stephen Cole Kleene在20世纪三十年代引入, Church在193

柯里化的前生今世(六):词法作用域和闭包

关于 在上一篇中,我们介绍了动态作用域,并进行了相关名词的解释. 我们解释了什么是环境,什么是帧,如何在一个环境中对表达式求值. 我们用一个内部结构表示了函数,实现了一个微型的支持动态作用域的解释器. 这一篇,我们将再往前一步,实现词法作用域(lexical scope). 动态作用域 vs 词法作用域 作用域(scope)的概念大家可能比较陌生, 但是闭包(closure)的概念在这几年非常流行,几乎已经没有什么主流语言不支持它了. 从实现角度,和函数一样我们将用另外一种内部结构表示闭包, ;