Haskell语言为什么值得你去学习
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语言为什么值得你去学习的更多相关文章
- 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这些基础知识点,但学前端开发除了要学这些基础知识外,学员还要在这之上进行延伸和深入的去学,而且互联网时代不 ...
随机推荐
- [算法]打印N个数组的整体最大Top K
题目: 有N个长度不一的数组,所有的数组都是有序的,请从大到小打印这N个数组整体最大的前K个数. 例如: 输入含有N行元素的二维数组代表N个一维数组. 219,405,538,845,971 148, ...
- eDocEngine_3.0.4.273的手动安装
1.安装FastReport 5: 2.编译Shared3(如对Delphi2007,打开gtSharedD11.groupproj项目文件),将产生的bpl.dcp文件分别拷贝到C:\Users\P ...
- 遇到“拒绝了对对象的 EXECUTE 权限”和“无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限”的问题
在将数据库从sqlserver2000迁移到2005后,原有的用户名TDS在执行存储过程是报错:“拒绝了对对象的 EXECUTE 权限”. 如网上所说,在使用的数据库的属性页->权限中给TDS添 ...
- Storm- Storm作业提交运行流程
用户编写Storm Topology 使用client提交Topology给Nimbus Nimbus指派Task给Supervisor Supervisor为Task启动Worker Worker执 ...
- c版基于链表的插入排序(改进版)
1. [代码][C/C++]代码 /** * @todo c版基于链表的插入排序 * @author Koma **/#include<stdio.h>#include<st ...
- meta 标签代码解决IE兼容问题,IE6,IE7,IE8,IE9,IE10(包括360的兼容模式)
最近做了一个项目,客户反映,在360下布局错位,远程调试了一下,发现客户使用的是360的兼容模式,然而我在自己的电脑上测试的时候是正常的(兼容模式也正常):简单研究了一下360的兼容模式,在360的兼 ...
- ssm+dubbo/zk
1.原始 Connection conn = null; String url = "jdbc:mysql://localhost:3306/emps?user=root&passw ...
- 谈MicroMessageTest的开始创建
一开始,创建一个可以看到的jsp前端页面. 只不过不是用纯jsp页面访问,而是用Servlet doGet跳转至jsp页面,req.getRequestDispatcher(jsp页面的全称 还是全地 ...
- Android SQLite学习指南
一.SQLite简介 在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对 ...
- 本地未安装Oracle数据库,如何连接远程Oracle数据库
方法一:用Navicat Premium连接 注意,这里用的要是黄色的版本,而不是只针对Mysql的绿色版本 工具栏选择[工具]-[选项],点击[其他-OCI] 你会发现有个OCI librar ...