《Haskell趣学指南》读书笔记(1):Ready Go

本文是《Haskell趣学指南》的第一部分,主要介绍了Haskell中的函数编写、list操作,包括let声明、++和:运算符、!!运算符以及常用list函数。还讲解了如何通过range创建list,以及tuple元组的相关操作。
摘要由CSDN通过智能技术生成

题外话: 修改命令行提示"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 forit: 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')]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值