Travel With Haskell 2 — 运算与List初步
运算
运算符
运算符大同小异,下面是几点需要注意的。
乘方符号为
∗∗
∗
∗
不等号为
/=
/
=
在求复杂算式的时候,要注意加括号,尤其是数字包括负数的时候
简单的内置函数
函数名 | 参数 | 备注 |
---|---|---|
succ | Num / Char | 求解其后继 |
max | Num | 求解最大值 |
min | Num | 求解最小值 |
函数调用有最高的优先级,如下面两句话是等效的
> succ 9 + max 1 2 + 100
112
> (succ 9) + (max 1 2) + 100
112
所以在搞不清楚运算优先级的情况下, 多加括号会大大减低犯错误的可能性。
Haskell的if语句格式
if语句中的else部分是强制的。具体规则如下。
doubleMe x = if x > 50
then x
else x + 50
上述函数的意思为,计算分段函数。
在Haskell中,首字母大写的函数是不允许的。原因在稍后的章节会介绍。
List
List的合并
List中只能装相同类型的元素
在ghci中,可以使用let关键字来定义一个常量,但是常量的首字母依旧不可以大写。否则会报错。
let numberList = [1,2,3,4,5]
[5] ++ numberList
5:numberList
可以使用 ++运算符来连接两个List。在使用++运算符的时候,haskell会遍历整个++左侧的序列。因此在对于特别长的字符进行处理的时候,最好的方法是使用:连接运算符,在前面插入。
但是使用:只可以插入单个数字或者字符,[5] : numberList 是不合法的。
List的索引
若要是想要获得下标,使用!!运算符。下标从0开始。
numberList !! 2
List的函数
函数名 | 返回值 | 备注 |
---|---|---|
head | 返回List的头部 | 首个元素 |
tail | 返回List的尾部 | 去掉头部的部分 |
last | 返回List最后一个元素 | |
init | 返回List除去最后一个元素的部分 | |
length | 返回List的长度 | |
null | 判断List是否为空 | |
reverse | 将List反转 | |
take | 返回一个List的前几个元素 | 若超出长度,则返回整个List |
drop | 返回除去前几个元素后的List | 若除去元素个数超过长度,返回空List |
maximum | 返回List中最大的元素 | |
sum | 返回List中所有元素的和 | |
elem | 判断元素是否办包含在List中 | 通常以中缀函数形式调用它。即 x `mod` y |
Range方法
haskell中的range类似于python中的range,可以指定sta,end,step,基本语法为[sta , sta + step .. end ],下面为示例。
> [20,19 .. 1]
[20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
> [20,18 .. 1]
[20,18,16,14,12,10,8,6,4,2]
> ['a', 'c' .. 'z']
"acegikmoqsuwy"
> [1.. 18]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
> [0.1, 0.2 .. 1]
[0.1,0.2,0.30000000000000004,0.4000000000000001,0.5000000000000001,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0]
注意如果是要逆序生成的,sta + step 不可省略,如果是浮点数,由于精度问题,可能会出现糟糕的结果。
但是如果想从无限循环的列表中取出前几个,就要用到cycle函数和repeat函数,通过实例来看他们之间有什么不同。
> take 6 (cycle [1,2,3])
[1,2,3,1,2,3]
> take 6 (repeat [1,2,3])
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
cycle相当于对List的每个元素逐次循环,而repeat是把参数当做一个整体进行循环。