Haskell语言为什么值得你去学习
Haskell语言为什么值得你去学习
当我向一些新手推荐学习Haskell语言时,得到的反应通常是:“为什么要学Haskell?”,“这是一种实用的语言吗?”或者“这是一种我可以真正用的语言吗?”我的回答是明确的YES。
Haskell并不是我工作时的主要语言(我基本上是为嵌入式系统写C程序),但我仍然发现Haskell难以置信的有用。虽然我的工作从来不用Haskell,我仍然认为花时间去学习它是值得的。那么,为什么要学习Haskell语言呢?
1. Haskell语言能很好的帮助运用C语言
事实证明,Haskell语言是一种非常强大的工具,能帮助你写好C程序。我使用Haskell能做的事情经常是我平时认为用常规方法根本不可行的事。
比如说,我的同事想在代码库里找到所有用在if
条件语句里的叫做foo
的变量。感谢神奇的language-c程序包以及Haskell语言的泛型,我可以写出一个Haskell函数,让它接受一个预处理的C源代码路径作为输入值,输出找到的位置(如果有的话),就像下面:
|
如果不包括类型标识,只有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语言为什么值得你去学习的更多相关文章
- Linux好学吗?怎么自学Linux?6个值得你去学习Linux的理由!
两个多月前,我对日常工作做出了一个非常重要的决定-我决定从Windows切换到Linux,将其作为个人和办公笔记本电脑的主要系统.除了开始时一些小的驱动程序问题之外,切换非常平稳,我不会考虑返回.如果 ...
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
- Haskell语言学习笔记(79)lambda演算
lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...
- Haskell语言学习笔记(69)Yesod
Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...
- Haskell语言学习笔记(20)IORef, STRef
IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...
- Haskell语言学习笔记(39)Category
Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...
- 从官方文档去学习之FreeMarker
一.前言 上一篇 <从现在开始,试着学会用官方文档去学习一个技术框架>提倡大家多去从官方文档学习技术,没有讲到具体的实践,本篇就拿一个案例具体的说一说,就是FreeMarker,选择这个框 ...
- 20165312 C语言基础调查和JAVA学习展望
C语言基础调查和JAVA学习展望 一.有关学习技能的经历 掌握一项技能,我认为最重要的是练习和认真程度. 我在上幼儿园的时候学过电子琴,上台表演过多次,但是三四年之后就半途而废了,后来小学毕业之后对钢 ...
- 零基础转行web前端,如何高效的去学习web前端
web前端开发要学的知识内容涉及的会很宽泛,虽然说主要是HTML.CSS和JavaScript这些基础知识点,但学前端开发除了要学这些基础知识外,学员还要在这之上进行延伸和深入的去学,而且互联网时代不 ...
随机推荐
- 【Flask】视图高级
# 视图高级笔记:### `add_url_rule(rule,endpoint=None,view_func=None)`这个方法用来添加url与视图函数的映射.如果没有填写`endpoint`,那 ...
- 操作系统原理2——OS结构
操作系统原理2——OS结构 计算机系统是由硬件系统和软件系统两部分组成, 操作系统是软件系统的一个组成部分,它是直接在硬件系统的基础上工作的,所以在研究操作系统之前,先必须对计算机系统的结构有一个 ...
- Eclipse快捷键与Notepad++ 快捷建冲突的问题
notepad++添加了zen coding插件以后,notepad++默认的快捷键中Alt+/也是其快捷键中的一个,表示toggle comment,而用myeclipce或eclipse的朋友都知 ...
- Idea 使用过程中遇到的问题记录
1.在Idea启动Tomcat,有时候提示项目启动 failed,请查看日志,此时的日志在Tomcat主目录的日志文件中是没有的,此时的日志记录在: C:\Users\wanhua.lu\.Intel ...
- CDH- CDH大数据集群运维
CDH前端CM监控不正常(未解决) Request to the Service Monitor failed. This may cause slow page responses. View th ...
- python ddt 重写
对此方法重写 def mk_test_name(name, value, index=0): 重写前 index = "{0:0{1}}".format(index + 1, in ...
- 【遍历二叉树】07恢复二叉搜索树【Recover Binary Search Tree】
开一个指针数组,中序遍历这个二叉搜索树,将节点的指针依次保存在数组里, 然后寻找两处逆序的位置, 中序便利里BST得到的是升序序列 ++++++++++++++++++++++++++++++++++ ...
- 【跨域】Access-Control-Allow-Origin
- luogu1901 发射站
单调栈 正着插一遍反着插一遍 记录每个点左边右边第一个比他高的... yyc太强辣 #include<iostream> #include<cstdlib> #include& ...
- HihoCoder1665方块游戏([Offer收割]编程练习赛40)(线段树)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在玩一款类似俄罗斯方块的游戏.与原版俄罗斯方块不同的是,落下方块都是长度不一的横向长条,并且不能移动也不能变成竖直方 ...