haskell是个神奇的语言。
函数式编程,我的理解是它讲所有东西都整成函数来实现。
比如说循环结构--递归函数
数据结构--构造函数
....
所以整个程序就是一个个函数套在一起。
比较有意思的是后面关于functor、monad的升格操作
还有对于副作用(IO)等的实现
第一个程序(sum
sum [] = 0 sum (n:ns) = n + sum ns sum [1,2,3] = { applying sum } 1 + sum [2,3] = { applying sum } 1 + (2 + sum [3]) = { applying sum } 1 + (2 + (3 + sum [])) = { applying sum } 1 + (2 + (3 + 0)) = { applying + } 6
小栗子:快速排序
qsort :: [Int] -> [Int] qsort [] = [] qsort (x:xs) = qsort ls ++ [x] ++ qsort rs where ls = [a | a <- xs , a <=x ] rs = [b | b <- xs , b > x ]
一个简洁的不能再简洁的快排
(不过是O (N^2) 的
常用函数
head 取序列的第一个元素
head [1,2,3]
1
tail 除去序列第一个元素
tail [1,2,3]
[2,3]
last 取序列的最后一个元素
init 取除了最后一个外的所有元素
(!!) 取出第 n 个
[1,2,3,4,5] !! 2
2
take 取出前 n 个
take 3 [1,2,3,4,5]
[1,2,3]
drop 去除前 n 个
drop 3 [1,2,3,4,5]
[4,5]
length 求序列长度
++ 拼接两序列
reverse 翻转序列
maximun 返回列表中最大元素
minimum 返回列表中最小元素
null 判断是否为空
filter 过滤
filter :: (a -> Bool) -> [a] -> [a]
filter f xs 保留满足 f 的元素
iterate 迭代
iterate f x = [x,f x, f (f x) ..]
ghci> take 10 (iterate (*2) 1)
[1,2,4,8,16,32,64,128,256,512]
fst 取二元组的第一个
snd 取二元组的第二个
zip 把两个序列连起来(舍去长出来的一段
zip [1,2,3] ['a','b','c','d']
[(1,'a'),(2,'b'),(3,'c')]
其他规则
1.haskell 中函数调用的优先级最高
f g x 视作 调用含有两个参数 g 和 x 的函数 f
f (g x) 先 g 再 f