本篇是笔记篇,介绍 Haskell 的强大的库函数,也可感受下与我们平常的 js 操作异同之处:
id
给定一个任何的值,都返回这个给定的值;
Prelude> id "myId" "myId" Prelude> :t id id :: a -> a
const
给定两个元素,只返回第一个;
Prelude> const 3 4 3 Prelude> :t const const :: a -> b -> a
flip
将返回翻转;
Prelude> flip const 3 4 4 Prelude> :t flip flip :: (a -> b -> c) -> b -> a -> c
error
抛一个异常;
Prelude> error "something error" *** Exception: something error Prelude> :t error error :: [Char] -> a
undefined
暂时定义没有实现的函数,不让编译器报错;
Prelude> ac = undefined Prelude> bc = ac+1 Prelude> :t undefined undefined :: a
min/max
比较大小;
Prelude> min 5 6 5
!!
取列表中第 n+1 个数;
Prelude> [1,2,3] !!2 3
reverse
将列表元素倒叙;
Prelude> reverse[1,2,3] [3,2,1]
head/last
取列表第一个元素或最后一个元素;
Prelude> head "Hello" 'H' Prelude> last "Hello" 'o'
init/tail
将列表最后一个元素或第一个元素去掉;
Prelude> init [1..10] [1,2,3,4,5,6,7,8,9] Prelude> tail [1..10] [2,3,4,5,6,7,8,9,10]
map
映射,得到一个新的列表;
Prelude> map (+1) [1,2,3,4] [2,3,4,5]
还可以借助 λ匿名函数实现更复杂的映射:
Prelude> map (\x->x^2+1)[1,2,3,4] [2,5,10,17]
filter
过滤函数;
Prelude> filter (>=7) [9,6,4,2,10,3,15] [9,10,15]
由过滤函数衍生的两个判断奇数(odd)偶数(even)的函数:
Prelude> odd 4 False Prelude> even 4 True
take/drop
take 函数可以从头连续地取得一个列表的几个元素;
Prelude> take 3 [1,2,3,4,5] [1,2,3]
drop 与 take 相反,将列表中的前几个元素舍弃;
Prelude> drop 3 [1,2,3,4,5] [4,5]
span/break
span 函数可以根据一个条件,从左至右,当遇到第一个不符合条件的元素时停止,将一个列表分成由两个列表组成的元组;
Prelude> span odd [1,3,5,6,9] ([1,3,5],[6,9])
break 函数则与 span 函数相反,它会根据一个条件,从左至右,当遇到符合条件的时候停止;
Prelude> break odd [1,3,5,6,9] ([],[1,3,5,6,9])
takeWhile/dropWhile
之前的 take 和 drop 函数是通过给定一个整数来取得或者去掉列表中的前几个元素,而 takeWhile 和 dropWhile 则需要一个条件来判断,条件不成立的时候停止取出或者去除;
Prelude> takeWhile (>5) [6,7,8,2,3,4] [6,7,8] Prelude> dropWhile (>5) [6,7,8,2,3,4] [2,3,4]
splitAt
这个函数可以将一个列表在任何的位置分开;
Prelude> splitAt 5 "HelloWorld!" ("Hello","World!")
repeat/replicate
重复函数repeat可以将一个元素在列表里重复无数次;
replicate 是复制函数,可以将一个元素复制给定的次数;
Prelude> repeat True [True,True,True,True,...... Prelude> replicate 5 True [True,True,True,True,True]
实际上,我们可以用 take 和 repeat 函数实现 replicate 函数:
Prelude> replicate1 n a = take n (repeat a) Prelude> replicate1 5 False [False,False,False,False,False]
any/all
查询一个列表中是否存在符合给定条件的元素;
Prelude> any even [1,3,5] False Prelude> all odd [1,3,5] True
and/or
and 会把一个列表中所有的布尔值用 && 连接起来;
or 则会把所有布尔值用 || 连接起来;
Prelude> and [True,True,False] False Prelude> or [True,True,False] True
elem/notElem
elem 函数可以判断一个列表中是否存在某一元素;
Prelude> elem 1 [4,5,1] True
notElem 是 elem 的否定;
Prelude> notElem 1 [4,5,1] False
iterate
迭代函数;
Prelude> iterate (*2) 1 [1,2,4,8,16,32,64,128,256,512,1024,2048......
until
函数 until 可以迭代地来生成数据直到满足给定的条件为止;
Prelude> until(>500)(*2)1 512
zip
zip函数可以将两个列表结合成一个元组的列表;
Prelude> zip [True,False,True,False] [2,4,5,6,7] [(True,2),(False,4),(True,5),(False,6)]
unzip
unzip 与 zip 逆向,是把一个二元元素列表分成两个列表元素的函数;
Prelude> unzip [(True,2),(False,4),(True,5),(False,6)] ([True,False,True,False],[2,4,5,6])
concat
concat 函数可以将一个列表中的列表相连;
Prelude> concat [[1,2],[3,4]] [1,2,3,4]
concatMap
map 函数将 [a] 计算为 [[b]] 类型的结果,再使用 concat 函数来得到类型为 [b] 的结果;
Prelude> map (replicate 3) [1,2,3] [[1,1,1],[2,2,2],[3,3,3]]