Haskell趣学指南
Posted 51CTO读书频道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell趣学指南相关的知识,希望对你有一定的参考价值。
内容简介:
《haskell趣学指南》是一本讲解haskell这门函数式编程语言的入门指南,语言通俗易懂,插图生动幽默,示例短小清晰,结构安排合理。书中从haskell的基础知识讲起,涵盖了所有的基本概念和语法,内容涉及基本语法、递归、类型和类型类、函子、applicative 函子、monad、zipper及所有haskell重要特性和强大功能。
《haskell趣学指南》适合对函数式编程及haskell语言感兴趣的开发人员阅读。
样章试读:
小朋友的第一个函数
函数的声明与它的调用形式大体相同,都是先函数名,后跟由空格分隔的参数表。不过后面多了个等号(=),并且后面的代码定义了函数的行为。
举个例子,我们先写一个简单的函数,让它将一个数字乘以2。打开你最喜欢的编辑器,输入如下代码:
doubleMe xx = x + x
将它保存为baby.hs或者任意名称,然后转至文件所在目录,打开GHCi,执行:l baby装载它。随后就可以跟我们的函数小朋友玩耍了:
ghci> :l baby [1 of 1] Compiling Main ( baby.hs, interpreted ) Ok, modules loaded: Main. ghci> doubleMe 9 18 ghci> doubleMe 8.3 16.6
+运算符对整数和浮点数都可用(实际上所有有数字特征的值都可以),所以我们的函数可以处理一切数值。
接下来声明一个取两个参数的函数,让它分别将两个参数乘以2再相加。修改baby.hs,将如下代码加到后面:
doubleUs x y = x * 2 + y * 2
注意 Haskell中的函数定义并没有顺序的概念,所以baby.hs中函数定义的先后对程序没有任何影响。
将它保存,在GHCi中输入:l baby再次装载。测试它的结果是否符合预期:
ghci> doubleUs 4 9 26 ghci> doubleUs 2.3 34.2 73.0 ghci> doubleUs 28 88 + doubleMe 123 478
你也可以在函数中调用其他的函数,如此一来我们可以将doubleUs函数改为:
doubleUs x y = doubleMe x + doubleMe y
这种模式在Haskell中十分常见:编写一些明显正确的简单函数,然后将它们组合起来,形成一个较为复杂的函数。这是减少重复工作的金科玉律。设想,如果哪天有个数学家验证说2其实该是3,我们该怎么改?在这里,我们只需要将doubleMe改为x + x + x即可,由于doubleUs调用doubleMe,于是整个程序便轻松进入2即是3的古怪世界。
下面我们再编写一个函数, 它将小于等于100的数都乘以2 (因为大于100的数都已经足够大了)。
doubleSmallNumber x = if x > 100 then x else x*2
这个例子就引出了Haskell的if语句。你也许已经对其他语言的else很熟悉,不过Haskell的if语句的与众不同之处就在于,else部分是不可省略的。
在命令式语言中,程序的执行就是一步又一步的操作,if语句可以没有else部分,如果条件不符合,就直接跳过这一步。因此,命令式语言中的if语句可以什么都不做。
而在Haskell中,程序是一系列函数的集合:函数取数据作为参数,并将它们转为想要的结果。每个函数都会返回一个结果,也都可以为其他函数所用。既然必须返回结果,那么每个if就必须同时跟着一个else,不管条件满足还是失败,都需要返回一个结果。一言以蔽之,Haskell中的if是一个必然返回结果的表达式(expression),而非语句(statement)。
假如我们想让之前的doubleSmallNumber函数的结果都加1,新的函数的定义将是如下的模样:
doubleSmallNumber' x = (if x > 100 then x else x*2) + 1
可以留意这里括号的使用,如果忽略掉括号,函数就会只在x小于等于100时给结果加1了。另外,也可以留意函数名最后的那个单引号,它没有任何特殊含义,只是一个函数名的合法字符罢了。通常我们会使用单引号来区分这是某函数的严格求值(与惰性求值相对)版本,或者是一个稍经修改但差别不大的函数。
既然'是合法字符,定义这样的函数也是可以的:
conanO'Brien = "It's a-me, Conan O'Brien!"
在这里有两点需要注意。首先就是我们没有大写Conan的首字母,因为函数是不能以大写字母开始的(我们将在后面讨论其原因 ),另外就是这个函数并没有任何参数。没有参数的函数通常被称作定义或者名字,在函数被定义之后我们就再也不能修改它的内容,conanO'Brien从此与字符串"It's a-me, Conan O'Brien!"完全等价。
更多精彩试读请点击下面:
以上是关于Haskell趣学指南的主要内容,如果未能解决你的问题,请参考以下文章