Haskell 语言为什么值得你去学习

oschina
 oschina
发布于 2013年03月12日
收藏 56

函数式编程

当我向一些新手推荐学习Haskell语言时,得到的反应通常是:“为什么要学Haskell?”,“这是一种实用的语言吗?”或者“这是一种我可以真正的语言吗?”我的回答是明确的YES

Haskell并不是我工作时的主要语言(我基本上是为嵌入式系统写C程序),但我仍然发现Haskell难以置信的有用。虽然我的工作从来不用Haskell,我仍然认为花时间去学习它是值得的。那么,为什么要学习Haskell语言呢?

1. Haskell语言能很好的帮助运用C语言

事实证明,Haskell语言是一种非常强大的工具,能帮助你写好C程序。我使用Haskell能做的事情经常是我平时认为用常规方法根本不可行的事。

比如说,我的同事想在代码库里找到所有用在if条件语句里的叫做foo的变量。感谢神奇的language-c程序包以及Haskell语言的泛型,我可以写出一个Haskell函数,让它接受一个预处理的C源代码路径作为输入值,输出找到的位置(如果有的话),就像下面:

 

parseAndFindFoos :: FilePath -> IO (Either ParseError [Position])

parseAndFindFoos path = liftM (fmap findFooLocations) (parseCFilePre path)

findFooLocations input = fmap posOf (listify isIfOfInterest input)

isIfOfInterest (CIf cond _ _ _) = not (null (listify isFooIdent cond))

isFooIdent (Ident name _ _) = name == "foo"

 

如果不包括类型标识,只有4行Haskell代码!类型标识通常用来做推导,它通常会被当作说明放到doc里。

这只是一个用在文章里起说明作用的小例子。我使用Haskell语言做了远比这复杂多的任务,例如从全局声明或函数里提取名称和类型,或执行变换, 往符合条件的表达式里插入日志函数或边界检查代码。你找不出多少其它语言能像Haskell语言那样让你又快又简洁的完成这种事情。

我并非是唯一一个在C语言开发中使用Haskell语言的人

我的一个同事开发了一个神奇的工具,叫做plunge,它能让你比较预处理的C代码和源代码,显示出源代码中的每行出现在经过预处理的代码的什么位置。

同样,还有:

  • atom – 一种Haskell语言开发的面向领域编程语言(DSL),能够执行编译调度,在限定的内存使用和准确的时间里编译编译代码。
  • copilot – 一种用Haskell开发的流式(例如无限长列表)DSL,可以编译进嵌入式C程序中。
  • ImProv – 用Haskell写的一种命令式编程语言,用于高保障性应用。

还有很多。

2. Haskell语言会改变你思维的方式

我真切的认为,学习Heskell编程能够立即直接带来的在编程方式上的附加效应就是,它会永远的改变你编程思考的方式。没错,没错,我知道这听起 来像那种不疼不痒的、含糊的废话,但我是很严肃的!学习Haskell语言已经对我编程方式、我思考的方式产生了大量的影响,比任何我在学校里学的任何东 西的影响都大,比任何我工作上的经验的作用都大。

你是否尝试过写出一个复杂的函数,但里面不含任何的可变变量?头次尝试这样写是十分痛苦的。但一旦你有了一些经验,不仅你会发现它会变得很容易,而 且你会开始认识到,你的函数可以分割成更小的片段,比你最初想象的更小。那些复杂的函数将会变的完全不是那么复杂;它们可以变成由三个简单函数组成的函 数!

这就像是,你只用右脚踢足球,但有一天,你的教练禁止你使用右脚。起初你怎么踢都觉得别扭。但最终你左脚变的和你的右脚一样厉害,你最终成为了一名更优秀的足球运动员。

Haskell语言是如此的与众不同,以至于它会迫使你用完全不同的方式思考你的程序。这就是它是一种很难学的语言的原因之一,但同样也是为什么学习它能获得这么多益处的原因。

3.Haskell语言陡峭的学习曲线是件好事

在学习Haskell语言时,人们最常见的抱怨是它陡峭的学习曲线。人们的感觉是对的,它的确具有一个陡峭的学习曲线。它给你的感觉就像是完全重新学习编程。它需要你费点功夫来忘掉你直觉上想用的那种编程模式。没有可变变量!静态类型!我的神呀,它可以把一个函数当成参数,并返回这个函数!怎么会有这种事!?

Haskell语言的难点并不是那些复杂的东西,而是那些简单的东西。比如Monads;Monads是出奇的简单。它就是一种数据类型,它的实例由两个非常简单的函数实现。大部分的实现都只有一、两行代码!领会这些隐式的,有用的,强大的东西会花去你大量的努力。深奥的东西需要花时间去学。这很正常。这意味着你在学一些值得学的知识。

“只是因为三轮车好学,你就要一辈子骑三轮车吗?” – Douglas Englebart

[英文原文: Why Haskell Is Worth Learning ]
本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:Haskell 语言为什么值得你去学习
加载中

最新评论(22

crab2313
crab2313
如果你的数学很好, haskell必须学,
haskell近乎每一部分都有数学的影子,
像monoid, monad, functor, currying, 这些都是切切实实的数学概念
蝴蝶飘飘
蝴蝶飘飘
我通常建议比较熟的同事,必须学习haskell与python
刘冲
刘冲

引用来自“john.liao”的评论

引用来自“lidashuang”的评论

引用来自“张亦俊”的评论

引用来自“Qbase”的评论

下一篇,我们为什么要学习OCaml

再来一篇,我们为什么要学习汇编

我们为什么要学习ruby

我们为什么要学习go

我们为什么不要学习go?
因为任何语言终有一天都会out...
Gmail.com
Gmail.com

引用来自“ssn6”的评论

引用来自“Gmail.com”的评论

引用来自“ssn6”的评论

智能手机在中国市场只有不到20%的占有率,而iphone在智能手机的占有率仅排到第7位,有时候我们认知到的范围不代表就是全世界。

醒一醒,国内市场早在去年智能机市场份额已经超过了功能机。
其次,智能机占有率国内前三分别是三星,联想和苹果。
需要我找数据的出处给你么?

呵呵,引用文章:《中国智能手机市场占有率排名 iPhone第七》( 2012-08-24 ) 请自行搜索谢谢!可能中国目前的人均经济水平还没有强大到 iPhone 大众化的程度 - 引用的数据可能不是最新的或不准确,而且个人看法可能与手机市场迅速的发展不符,还请见谅,您的提醒更让我明白个人知识的局限性,不可妄自尊大,非常感谢!

智能手机行业发展变化还是很快的,这个是3月11日的新闻数据:
http://it.sohu.com/20130311/n368383852.shtml
s
ssn6

引用来自“Gmail.com”的评论

引用来自“ssn6”的评论

智能手机在中国市场只有不到20%的占有率,而iphone在智能手机的占有率仅排到第7位,有时候我们认知到的范围不代表就是全世界。

醒一醒,国内市场早在去年智能机市场份额已经超过了功能机。
其次,智能机占有率国内前三分别是三星,联想和苹果。
需要我找数据的出处给你么?

呵呵,引用文章:《中国智能手机市场占有率排名 iPhone第七》( 2012-08-24 ) 请自行搜索谢谢!可能中国目前的人均经济水平还没有强大到 iPhone 大众化的程度 - 引用的数据可能不是最新的或不准确,而且个人看法可能与手机市场迅速的发展不符,还请见谅,您的提醒更让我明白个人知识的局限性,不可妄自尊大,非常感谢!
Gmail.com
Gmail.com

引用来自“ssn6”的评论

智能手机在中国市场只有不到20%的占有率,而iphone在智能手机的占有率仅排到第7位,有时候我们认知到的范围不代表就是全世界。

醒一醒,国内市场早在去年智能机市场份额已经超过了功能机。
其次,智能机占有率国内前三分别是三星,联想和苹果。
需要我找数据的出处给你么?
s
ssn6
智能手机在中国市场只有不到20%的占有率,而iphone在智能手机的占有率仅排到第7位,有时候我们认知到的范围不代表就是全世界。
CycleUser
CycleUser

引用来自“ssn6”的评论

个人认为有很多的非主流语言了解一些对开阔思路很有好处,例如lisp,forth,haskell都非常的有意思,你不一定要去用但是可以去学,

并不一定使用的人多就表示是最好的,就象在中国主流的是山寨手机用的人最多,但是不能说小众使用的iphone就更加烂,有时候用户量并不表示他就是最好的.

而且每一种编程语言都不是无所不能的,其实我们对非主流的语言更多一些包容心,虽然我不学或者不用,但是我不一定要去喷,对不懂的东西保留一分敬畏和尊重体现的是博大的智慧,这世界上正是因为存在很多我们不了解、未知、或者可能部份人不接受的东西才会多姿多彩!

渣果不是街机么?小众了?
s
ssn6

引用来自“CLLam”的评论

其实Haskell真的值得一学,挺有意思一门语言。

欣赏并佩服这种心态:看到更多的优点并虚心学习而不是只看到更多的缺点并狂妄自大
s
ssn6
个人认为有很多的非主流语言了解一些对开阔思路很有好处,例如lisp,forth,haskell都非常的有意思,你不一定要去用但是可以去学,

并不一定使用的人多就表示是最好的,就象在中国主流的是山寨手机用的人最多,但是不能说小众使用的iphone就更加烂,有时候用户量并不表示他就是最好的.

而且每一种编程语言都不是无所不能的,其实我们对非主流的语言更多一些包容心,虽然我不学或者不用,但是我不一定要去喷,对不懂的东西保留一分敬畏和尊重体现的是博大的智慧,这世界上正是因为存在很多我们不了解、未知、或者可能部份人不接受的东西才会多姿多彩!
返回顶部
顶部