Python vs Haskell (翻译) ::-- ZoomQuiet [2007-04-24 11:29:05]

CPUG联盟::

CPUG::门户plone

BPUG

SPUG

ZPUG

SpreadPython Python宣传

1. Python vs Haskell (翻译)

Haskell是一种非常现代的函数式编程语言(像Lisp等)。这门语言并不是很流行但却应用在一些实际的项目中(不只是一种试验性语言)并且在实际行业中应用越来越普遍。比如 darcs 版本管理系统就是用 Haskell 写的。更多信息请看 http://www.haskell.org

Haskell 和 Python之间很难一对一的比较,因为他们在很多方面相当的不同。但是两种语言的大部分用户都会同意他们都设计的非常优雅。

1.1. 函数式 vs 过程式

Functional vs Procedural: 函数式 vs 过程式

Haskell 是一种Lazy (延迟计算),被称为"纯函数式" (没有赋值或副作用)的语言。它通过类型类来支持参数多态(有些像C++的模板的作用,但比那更强大)和Ad-hoc多态。 Python为程序员提供了丰富的编程范型,包括过程式、函数式与面向对象式。Lazy编程可以通过产生器和迭代器来实现。Python对于函数式编程有一定的支持,但是由于存在大量的副作用以及缺乏对尾递归的内建支持,使得在Python中使用函数式编程显得有些笨拙。Haskell通过Monad(来自范畴论)来支持过程式编程,这也是Haskell的纯函数式世界与现实世界的副作用的桥梁(如图形界面,输入输出,文件系统,socket等)。命令式编程并非Haskell的(主要)意图也并非其强项。不过很多 Haskell程序员声称Haskell是他们最喜欢的命令式语言:) Compiled vs Interpreted: 编译 vs 解释

Python的主要实现是一个解释器。Haskell有一把的实现,包括一些解释器(Hugs, GHCi)和一些生成本地代码的编译器(GHC, nhc98)。Haskell和Python一样都是一种(很)高级的编程语言,所以并不应期待它会像C或者汇编一样的性能。Haskell的类型系统提供了更多的编译时信息,这样大多数情况下haskell的本地代码编译器会比Python更有速度优势: 速度比较

http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=python...

Pythonic 的编程哲学:把性能关键部分丢给C,同样适用于Haskell。通过 FFI (foreign function interface), haskell的函数可以调用C程序,或者被C程序调用。 另一种可选的做法是通过编译器特定的扩展(特别是ghc)和更严格的标记,这可以让他们之间的变得铁板一块。

1.2. 静态类型 vs 动态类型

Static vs Dynamic Typing: 静态类型 vs 动态类型

Haskell和Python都具有强类型,也就是说类型的示例不能被用作另一种类型。必须使用显示的转换。不同之处在于 Haskell是静态类型,而Python是动态类型。在Haskell中,

每一个表达式和值(译注1)的类型在编译时都是已知确定的,而在Python 中表达式和变量并没有类型--他们所引用的对象有类型,但是直到运行时才能知道,并且对象可以通过提供正确的函数(如 length 等) 来假装成另一种类型。因为类型系统是Haskell中非常基础的部分(这使得这门语言写的程序容易被验证),这一点是与Python的一个基础的不同点。不过,对于那些想到每次用一个变量前都要先写 int i就发抖的python用户,大可宽心:Haskell的编译器和解释器足够的聪明几乎总是可以推断出你的表达式的类型,所以你可以不必写他们。

(译注2) 比如,把5的值分配到一个表示符 'a' ,在Python和Haskell中的代码是完全一样的:

a = 5 (译注3实际上Haskell编译器把它推断成一个 Integer 类型。

1.3. List Comprehension Syntax:

必须指出的是他们有一个相似点: 列表内涵式语法 Python的列表内涵式语法是直接从Haskell拿过来的。(当然有一些琐碎关键字和符号的修改) 列表内涵这主意实在太棒了没办法拒绝。

1.4. Significant Whitespace: 缩进语法

他们都把缩进作为语法。在Python中, tab/空格是语法,而Haskell中 tab/空格是定义良好的语法糖,(最终)转换成括号和分号的程序块的语法。有人会说Haskell的方式是缩进语法这种想法的一个进步,通过允许程序员使用显式的括号和分号标记的语法块可以避免很多头疼的问题,如在网页上拷贝粘贴代码~~

1.5. Learning Curve: 学习曲线

对于没有函数式编程经验的程序员来说Haskell的学习曲线相当陡峭。很多情况下,延迟计算对命令式语言浸泡出来的大脑来说显得违反直觉和常识,你必须忘却一些阻止你的程序吃光内存的技术。

对我而言(Nioate原作者),学习OCaml让我比较平滑的过渡到Haskell,因为ML有一个和Haskell类似的类型系统。理解了类型系统后,跳入Haskell则是毫不犹豫的, 除了一些新的语法,只需要学习如何利用延迟计算,类型类和Monad。(不要让 Monad 吓到你,先学习List和Maybe monad.)

(译注4)

对我而言(albertlee译作者),学习haskell之前短暂的学习过Erlang ,而在那之前则是Lisp, scheme和Python,尽管为FP做了很多的铺垫,但进入Haskell的世界依然遇到了很多的困难,尤其是Monad, type class 。毕竟国内这方面的中文资料比较少,学习的伙伴也比较少。

1.6. Using both Python & Haskell with ctypes (-;

2. 反馈

  1. 值,原文为 variable , 但 haskell中并没有 variable 这个概念。 (1)

  2. 我对此表示怀疑……不过每次都写上类型的生命是一个好的习惯,这有助于思考。 (2)

  3. 不过在两种语言中,他们的含义是完全不一样的,Python中就是一个变量赋值,而haskell中则是声明了一个函数a,这个函数的值是常量5. (3)

  4. List 本身就是 Monad (4)

PyVsHaskell (last edited 2009-12-25 07:12:53 by localhost)