Haskell语言为何值得你去学习

摘自http://www.vaikan.com/why-haskell-is-worth-learning/

 

 

Haskell语言为何值得你去学习

 

当我向一些新手推荐学习Haskell语言时,获得的反应一般是:“为何要学Haskell?”,“这是一种实用的语言吗?”或者“这是一种我能够真正的语言吗?”个人回答是明确的YESgit

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

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写的一种命令式编程语言,用于高保障性应用。

还有不少。atom

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

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

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

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

Haskell语言是如此的不同凡响,以致于它会迫使你用彻底不一样的方式思考你的程序。这就是它是一种很难学的语言的缘由之一,但一样也是为何学习它能得到这么多益处的缘由。

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

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

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

“只是由于三轮车好学,你就要一生骑三轮车吗?” – Douglas Englebart

[英文原文: Why Haskell Is Worth Learning ]
相关文章
相关标签/搜索