题外话: 修改命令行提示"prelude"的命令为: :set prompt "xxx"
函数相关
|| 函数书写的语法
||| 命令行中写函数 ( 注意:在命令行中的函数声明,若没有参数,则等价于变量的初始化,称其为“定义”)
doubleMy x = x + x;
||| 在编辑器中写函数:
用任一编辑器在文件中写函数
:l 文件名 --加载文件中的函数
|| 函数名的规则:函数名不允许首字母大写
|| 函数中的选择条件语句:注意haskell中if与else必须同时出现(不能只写if)
doublenum x = if x > 100 then x
else x * 2
list 相关
|| let声明
命令行中的let a = 1
等价于 在脚本中 a=1
,在程序存活期一直存在
Prelude> let arr = [3,4,5,6,1,2,9]
Prelude> arr
[3,4,5,6,1,2,9]
|| ++运算符
同维度对象间的合并,eg:一维数组和一维数组,二维数组和二维数组
Prelude> [1,2,3,4] ++ [5,6,7,8,9]
[1,2,3,4,5,6,7,8,9]
Prelude> [[1]] ++ [[2],[3]]
[[1],[2],[3]]
|| :运算符
单个冒号:的作用—向list前端插入一个元素 (tips:双冒号的作用:: 特殊的函数声明符 )
低一维度对象插入高一维度对象的头部
Prelude> 5: [6,7,8,9]
[5,6,7,8,9]
Prelude> [1,2,3] : [[4,5,6]] --一维数组插到二维数组
[[1,2,3],[4,5,6]]
|| !! 运算符
按照索引取list对应位置的值
Prelude> [1,2,3,4,5,6] !! 2
3
|| list 中的比较
顺序依次比较对应元素大小,无关list元素个数
Prelude> [1,2,4] > [1,2,3]
True
Prelude> [9] > [1,2,3]
True
|| list 的常用函数
list的长度
||| length 返回list的长度
||| null 判断list是否为空
list区间相关操作
||| reverse 翻转list
||| take int number 取list 的前几个元素 (pro版的head)
||| drop int number 删除list 的前几个元素 (pro版的last)
list值计算相关操作
||| maxinum
||| mininum
||| sum
||| elem 判断一个元素是否包含于一个list(一般使用中缀函数形式调用)
Prelude> 4 `elem` [1,2,3,5] -- 注意中缀调用用的是右引号``而不是左引号''
False
list头尾相关操作
||| head返回一个list的头部(即首个元素)
||| tail 返回一个list的尾部(注意:不是最后一个元素,而是除去收个元素以外的所有元素)
||| last 返回一个list的最后一个元素
||| init返回list出去最后一个元素后剩下的部分
head 《= = =》 last 取头取尾
tail 《= = =》init 去头去尾
range相关
|| 使用 “…” 进行合理省略,可以规定步数
Prelude> [1..10]
[1,2,3,4,5,6,7,8,9,10]
--规定步数
Prelude> [3,4..20]
[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
(tip:尽量避免在Range 中使用浮点数)
|| repeat int num 无限重复某个数 (配合take使用,按需取数)
Prelude> take 10 (repeat 3)
[3,3,3,3,3,3,3,3,3,3]
|| cycle int num 无限重复某组数 (配合take使用,按需取数)
Prelude> take 10 (cycle [1,2,3])
[1,2,3,1,2,3,1,2,3,1]
集合形式创建list
前文都是使用方括号和特定函数来创建list,现在介绍另外一种创建lis方法
|| 语法:类似图片
| 竖号前,是最终显示的元素形式
| 竖号后,是x的取值范围和过滤条件
相关示例:
[ x*2 | x <- [1…10]]
[x *2 | x <- [1…10], x * 2 >= 12 ]
[x *2 | x <- [1…10], x ‘ mod ’ 3 == 3 ]
[if x < 10 then “BOOM!” else “BANG!” | x <- [1…100] , odd x] (odd 是判断奇数的函数)
[x | x<-[1…10], x /= 2] (注意:不等于号不是!= ,而是/=)
|| 使用集合创建list的方式重写函数
|||重写length
length’ xs = sum [1 | _<-xs] (下横杠表示我们不关心list中取什么值,取到就行了)
|||删除所有非小写字母
removeUpletters st = [c | c <- st, c ‘elem’ [‘A’…‘Z’]]
|||去除所有奇数
[ x | x <- [1…30] , even x] (even 是判断奇数的函数)
tuple元组相关
|| 元组中元素的数据类型不一定相同,可以包含任意的数据类型,但是若是包含tuple的list,则list尾部所有元素都必须以第一个元组的结构为基准
--错误
Prelude> [(11, 11), (22, 22,222)]
<interactive>:126:12: error:
? Couldn't match expected type ‘(a, b)’
with actual type ‘(Integer, Integer, Integer)’
? In the expression: (22, 22, 222)
In the expression: [(11, 11), (22, 22, 222)]
In an equation for ‘it’: it = [(11, 11), (22, 22, 222)]
? Relevant bindings include
it :: [(a, b)] (bound at <interactive>:126:1)
--正确
Prelude> [(11, "11"), (22, "22")]
[(11,"11"),(22,"22")]
|| 操作序对的相关函数(序对即二元tuple)
|||返回序对的首项和尾项
fst (8,11) 、 fst (("Wow", False))
snd(8, 11)、snd(("Wow", False))
||| zip压缩函数:将两个list压缩成一个序对组(二元数组)
Prelude> zip [1,2,3] ['a','b','c']
[(1,'a'),(2,'b'),(3,'c')]