这一系列博客是《Learn You a Haskell for Great Good》的读书笔记。
一句话介绍:Haskell是一门纯粹的函数式编程语言。至于什么是函数式编程?尽管网上也有很多关于函数式语言与指令式语言之间的区别与联系,但是没有实际使用过函数式编程语言的情况下,我也搞不清楚。因此,先从学习一门函数式编程语言开始吧。
1.安装Haskell
要开始使用Haskell其实很简单,只需要一个文本编辑器和一个Haskell的编译器。目前来说最流行的Haskell的编译器是Glasgow Haskell Compiler(GHC),我使用的就是这样一个编译器。
一般来说,我们会安装Haskell Platform,因为它不仅包含了Haskell编译器,还绑定了一下常用的库。Haskell的官方网站是:http://www.haskell.org/haskellwiki/Haskell不管是Windows版本、Linux版本、Unix版本都有。
我使用的是Ubuntu系统,使用apt-get
安装其实很简单,只需要一条命令就好啦:
sudo apt-get install haskell-platform
GHC不但可以编译Haskell脚本(.hs文件),也可以以交互式方式运行。要启动交互模式,在终端中输入:
ghci
这时,中断会输出一些信息:
GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude>
如果在Haskell文件中定义了一些函数,可以在GHC交互式解析器中输入:
:l myFunctions
来载入你定义的函数。
2.基本算数操作
算数操作基本上和Java等其他语言都比较类似,直接举几个例子:
Prelude> 2 + 3
5
Prelude> 2 * 3
6
Prelude> 2 - 3
-1
Prelude> 2 / 3
0.6666666666666666
需要特别注意的事情是,在使用负数的时候,最好是使用括号,举个例子:
Prelude> 2 * -3
<interactive>:7:1:
Precedence parsing error
cannot mix `*' [infixl 7] and prefix `-' [infixl 6] in the same infix expression
3.布尔代数
Haskell的与、或、非其实也很直接,直接看例子:
Prelude> True && False
False
Prelude> True && True
True
Prelude> True || False
True
Prelude> not False
True
判断是否相等、是否不等:
Prelude> 2 == 3
False
Prelude> 2 /= 3
True
实际上尽管我们没有提过函数,但是其实已经用到了函数,*
运算实际上是一个函数,它接收两个参数,上面那种形式叫做中缀函数,但是实际上大部分函数是以前缀函数的形式调用的,下面介绍几个:
Prelude> succ 8
9
Prelude> max 7 8
8
Prelude> min 8 9
8
Prelude> div 9 2
4
5.函数需要注意的
这几个函数的作用非常明显。但是需要注意的是div
函数其实等价于Java语言中的/
运算符,小数部分是舍弃的。上面的函数我们也可以以中缀函数的形式调用,比如:
Prelude> 9 div
2
4
我们可以定义自己的函数,函数定义的格式如下:
函数名 = 函数代码
我们新建一个.hs文件,在其中定义一个函数:
doubleMe = x * 2
输入:l file.hs
,在交互式解析器中加载你所定义的函数,这时,解析器会输出如下信息:
Prelude> :l baby.hs
[1 of 1] Compiling Main ( baby.hs, interpreted )
Ok, modules loaded: Main.
*Main>
接下来就可以使用你所定义的函数了:
*Main> doubleMe 2
4
在定义别的函数的时候可以使用已经定义的函数,例如:
doubleUs x y = x * 2 + y * 2
Haskell中也有if
表达式,但是与Java语言的if表达式有一些区别,我们先看一个例子:
doubleSmallNumber x = if x > 100 then x else x * 2
这个函数的意思是,如果一个数小于等于100,就翻倍,否则保持不变。但是需要注意的是,Haskell中的else部分是必须有的。此外还需要注意的是,Haskell函数名的首字母必须小写。
如果函数没有参数,那么这样的函数在Haskell中叫做定义或者名称。这一点有点类似于Java中的变量,但是有非常重要的区别:Haskell中的定义一旦给出就不允许改变
6.List概述
Haskell中的List是一种比较均匀整齐的数据结构,之所以说它均匀整齐是因为其中的元素必须是相同类型的。List是被方括号包裹起来的:
*Main> let nums = [1,2,3,4]
*Main> nums
[1,2,3,4]
在GHCi中需要使用let
来定义一个List。List有很多操作,下面分别介绍。
List连接操作
使用++来连接两个List,直接看代码:
*Main> nums ++ [5,6]
[1,2,3,4,5,6]
在Haskell中,字符串实际上就是列表,也可以使用++进行连接操作:
*Main> "Hello," ++ " " ++ "World!"
"Hello, World!"
可以使用:操作符将一个元素放到一个列表最前面:
*Main> 0 : [1,2,3] [0,1,2,3]
可以使用!!使用索引访问List中的元素: *Main> [1,2,3,4] !! 3
4
索引号是从0开始的。
List比较大小
List比较大小的前提是List元素是可以比较的,比如说数字,比如说字母(按照字母表顺序)。比较的规则是以此比较每一个元素直到出现不同的元素,那第一个不同元素,元素大的List大:
*Main> [1,2,3] < [1,2,4]
True
*Main> [1,2,3] < [1,2,3]
False
*Main> [1,2,3] < [1,2,2]
False
其他List操作
head:可以取出List的首元素;
tail:将List去掉首元素;
last:返回List的末尾元素;
init:返回除最后一个元素之前的所有元素构成的List
length:返回元素个数
null:判断List是否为空列表
take n [...]:从列表中取出n个元素
drop n [...]:忽略n个元素后返回List
maximum/minimum:取出最大/最小值
sum:所有元素求和
product:所有元素乘积
elem:判断元素是否在列表中
reverse:List倒置
*Main> head [1,2,3]
1
*Main> tail [1,2,3]
[2,3]
*Main> last [1,2,3]
3
*Main> init [1,2,3]
[1,2]
*Main> take 3 [1,2,3,4,5,6]
[1,2,3]
*Main> drop 3 [1,2,3,4,5,6]
[4,5,6]
*Main> length [1,2,3]
3
*Main> null []
True
*Main> reverse [1,2,3]
[3,2,1]
*Main> maximum [1,2,3]
3
*Main> minimum [1,2,3]
1
*Main> sum [1,2,3]
6
*Main> product [1,2,3]
6
*Main> 4 `elem` [1,2,3,5]
False
分享到:
相关推荐
《Haskell语言教程》是一本深受开发者欢迎的在线书籍,主要目标是帮助初学者深入理解Haskell这门纯函数式编程语言。Haskell以其强大的理论基础、严格的类型系统和静态类型而著称,它鼓励程序员编写简洁、清晰且易于...
By working through 43 easy-to-follow lessons, you'll learn Haskell the best possible way—by doing Haskell! Purchase of the print book includes a free eBook in PDF, Kindle, and ePub formats from ...
《Learn You A Haskell For Great Good》是一本非常优秀的Haskell入门书籍,不仅覆盖了Haskell语言的基础知识,还介绍了其独特的高级特性。无论你是编程新手还是希望扩展技能树的经验开发者,都能从本书中获得有价值...
Haskell 学习资料,Learn you a Haskell.
- Learn You a Haskell for Great Good!: 一本面向初学者的Haskell教程,风格幽默,内容详尽。 以上内容概括了Haskell文档中的主要知识点,希望能帮助读者更好地理解Haskell语言的特点及其在实际开发中的应用。
http://learnyouahaskell.com/ 这个网站的pdf版,比较系统的haskell教程,不过是英文的
在编程世界中,Haskell是一种纯函数式编程语言,以其优雅的语法、强大的类型系统和对数学理论的深入应用而闻名。"learn-haskell"项目显然旨在帮助学习者掌握这门语言的基础和高级概念。下面将详细介绍Haskell的学习...
《学习您的Haskell笔记本》是基于Jupyter Notebook的Haskell学习资源,改编自经典的Haskell教程《Learn You a Haskell for Great Good!》。这个项目旨在为Haskell初学者提供一个交互式的学习环境,通过Jupyter ...
《基于第一原理的Haskell》是一本深入探讨Haskell编程语言的著作,旨在通过解析Haskell的核心概念,帮助读者从基础出发理解这门函数式编程语言。Haskell以其纯净的函数式特性、静态类型系统和强类型推导而闻名,是...
在本文中,我们将深入探讨Haskell这一纯函数式编程语言,它是编程..."learn-haskell-master"这个项目可能是Haskell初学者的学习资源,包含教程、示例代码和练习,对于想要深入理解Haskell的人来说是一个很好的起点。
文档的标题“Learn_You_a_Haskell_for_Great_Good.pdf”和描述部分表明这本书是关于学习Haskell语言的入门指南。Haskell是一种高级的纯函数式编程语言,它具有强类型系统和惰性求值特性。它以其在编程语言理论领域的...