Haskell学习笔记-- Introduction/常用函数

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

 

posted @ 2021-11-16 10:19  liankewei123456  阅读(96)  评论(0编辑  收藏  举报