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

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

当我向一些新手推荐学习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 ]

Haskell语言为什么值得你去学习的更多相关文章

  1. Linux好学吗?怎么自学Linux?6个值得你去学习Linux的理由!

    两个多月前,我对日常工作做出了一个非常重要的决定-我决定从Windows切换到Linux,将其作为个人和办公笔记本电脑的主要系统.除了开始时一些小的驱动程序问题之外,切换非常平稳,我不会考虑返回.如果 ...

  2. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  3. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  4. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  5. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  6. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  7. 从官方文档去学习之FreeMarker

    一.前言 上一篇 <从现在开始,试着学会用官方文档去学习一个技术框架>提倡大家多去从官方文档学习技术,没有讲到具体的实践,本篇就拿一个案例具体的说一说,就是FreeMarker,选择这个框 ...

  8. 20165312 C语言基础调查和JAVA学习展望

    C语言基础调查和JAVA学习展望 一.有关学习技能的经历 掌握一项技能,我认为最重要的是练习和认真程度. 我在上幼儿园的时候学过电子琴,上台表演过多次,但是三四年之后就半途而废了,后来小学毕业之后对钢 ...

  9. 零基础转行web前端,如何高效的去学习web前端

    web前端开发要学的知识内容涉及的会很宽泛,虽然说主要是HTML.CSS和JavaScript这些基础知识点,但学前端开发除了要学这些基础知识外,学员还要在这之上进行延伸和深入的去学,而且互联网时代不 ...

随机推荐

  1. 【Flask】query可用参数

    ### query可用参数:1. 模型对象.指定查找这个模型中所有的对象.2. 模型中的属性.可以指定只查找某个模型的其中几个属性.3. 聚合函数. * func.count:统计行的数量. * fu ...

  2. JavaScript的undefined与null、NaN的区别

    Javascript的数据类型 在JavaScript中,有三种住数据类型.两种复合数据类型和两种特殊数据类型. 1.主数据类型(基元数据类型) 字符串 String数据类型: 字符串值是一个由零个或 ...

  3. hiho一下 第二十九周 最小生成树三·堆优化的Prim算法【14年寒假弄了好长时间没搞懂的prim优化:prim算法+堆优化 】

    题目1 : 最小生成树三·堆优化的Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生 ...

  4. SDUT 1048 Digital Roots

    Digital Roots Time Limit: 1000ms   Memory limit: 65536K 题目描述 The digital root of a positive integer ...

  5. Hadoop- DistCp(分布式拷贝)

    在实际的生产环境中,我们的企业都有测试集群和生产集群,有的比较大型的企业有多个版本的Hadoop 大数据集群,这时候有个这样的需求,各个集群上的资源需要进行迁移,比如说一些生产集群需要一些测试集群的数 ...

  6. virtualbox 相关操作

    关闭 vboxmanage controlvm nenew poweroff 打开,后台运行 vboxmanage startvm centos0 --type headless 复制虚拟机镜像VBo ...

  7. angularjs file upload插件使用总结

    之前由于项目需要,决定使用angularjs做前端开发,在前两个项目中都有文件上传的功能,因为是刚接触angularjs,所以对一些模块和模块间的依赖不是很了解.都是由其他大神搭好框架,我只做些简单的 ...

  8. java:Map借口及其子类HashMap四

    java:Map借口及其子类HashMap四 使用非系统对象作为key,使用匿名对象获取数据 在Map中可以使用匿名对象找到一个key对应的value. person: public class Ha ...

  9. php版微信公众平台开发之验证步骤实例详解

    本文实例讲述了php版微信公众平台开发之验证步骤.分享给大家供大家参考,具体如下: 微信公众平台开发我们现在做得比较多了,这里给各位介绍的是一个入门级别的微信公众平台验证基础知识了,有兴趣的和小编来看 ...

  10. QToolBox

    QToolBox类似与以前qq好友分组的那种控件.每个分组是一个Item. 一.添加分组: 其中每个分组是通过一下函数添加的: int addItem(QWidget * w, const QIcon ...