调用函数
(*)也是一个函数,只是在调用时将参数放在符号的两侧,称为 中缀函数.
大部分函数作为 前缀函数 存在,调用方法为: 函数名 + 空格 + 参数列表(由空格隔开) .
在Haskell中,函数拥有最高优先级:
ghci> succ 9 + max 5 4 + 1
16
等同于:
ghci> (succ 9) + (max 5 4) + 1
如果函数有两个参数,此时可以将函数用反引号(‘)将他扩起,然后以中缀函数的形式进行调用:
ghci> 1 `div` 2
定义一个函数
函数的定义格式: 函数名 + 空格 + 参数列表(空格分开) = 函数行为
doubleMe x = x + x
一个包含条件表达式的函数:
doubleSmallNumber x = if x > 100
then x
else x * 2
Haskell中if是一个必须返回值得表达式而非语句,所有时刻都要用else分支,并且多分支的返回类型一致.
列表入门
列表作为但类型不限长度的数据结构.
拼接列表:
[1,2,3,4] ++ [2,3,4,5]
1 : [2,3]
访问列表元素,下标从0开始:
"helloworld" !! 3
l
[1,2,3,4] !! 2
3
比较列表,会按照元素顺序逐个比较:
[3,2,1] > [2,1,0]
True
[3,4,2] == [3,4,2]
生成列表
[1..10]
[1,2,3,4,5,6,7,8,9,10]
['a'..'z']
"abcdefghijklmnopqrstuvwxyz"
['A'..'Z']
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
[2,4..12]
[2,4,6,8,10,12]
cycle函数接收一个列表作为参数并返回一个无线列表:
ghci> take 10 (cycle [1,2,3])
[1,2,3,1,2,3,1,2,3,1]
ghci> take 12 "LOL "
"LOL LOL LOL "
repeat函数接收一个值作为参数,并返回一个仅包含该值得无线列表:
take 10 (repeat 6)
[6,6,6,6,6,6,6,6,6,6]
replicate函数接收两个参数,第一个作为重复次数,第二个作为要重复的元素,生成一个定长列表:
replicate 3 10
[10,10,10]
列表推导式
用列表推导式生成前十个偶数:
[x * 2 | x <- [1..10]]
[2,4,6,8,10,12,14,16,18,20]
符号(|)后面的部分,首先生成一个有前十个数字组成的列表,表达式 x <- [1..10] 去个该列表的每个元素,即将列表中的每个元素值逐个绑定到变量x上,符号(|)前的部分值推导式的输出,表示所取的值与结果的映射关系.
如果需要给这个推导式添加一个谓语函数,比如只取大于12的元素,可以在推导式的最后面用逗号隔开,添加一个谓语函数:
ghci> [x * 2 | x <- [1..10], x * 2 >= 12]
[12,14,16,18,20]
或者50到100中所有除7后余数为3的元素:
ghci> [x | x <- [50..100], x `mod` 7 == 3]
[52,59,66,73,80,87,94]
或者想要一个推导式,能够是列表中所有大于10的奇数变成”BANG”,小于10的奇数变成”BOOM”,其他统统扔掉,我们定义一个函数:
boomBangs xs = [if x < 10 then "BOOM" else "BANG" | x <- xs, odd x]
上面的函数如果在ghci中定义则需要在函数名前添加一个let关键字.
odd函数判断一个数是否为奇数,是则返回True,否则为False,一个元素只有在满足谓词函数时才会被保留,如果有多个谓词函数,中间用逗号分隔即可:
ghci> [x | x <- [10..20], x /= 13, x /= 15, x /= 17]
上面的推导式求得10到20中不等于13,15,17的数.
或者从多个列表中取元素,如果从多个列表中取元素时,将得到这些列表中元素的所有组合:
ghci> [x + y, x <- [1,2,3], y <- [10,100,1000]]
或者编写一个自己的length函数,函数首先将列表中的元素替换为1,然后求和,或者列表的长度:
length` xs = sum [1 | _ <- xs]
元组
元素类型不同,数量固定.两个相等的元组必须长度相同,元素类型及类型顺序相同.没有单元素的元组.
fst回去元组头项,snd获取尾项,仅用于二元组.
zip函数接收两个列表作为参数,生成一个有二元组构成的列表.
使用元组和列表推导式求直角三角形:三条边长度为整数,并小于等于10,三边和为24.
首先列出三边均小于等于10的整数三元组,:
triples = [ (a,b,c) | a <- [1..10], b <- [1..10], c <- [1..10]]
然后添加一个条件使其满足勾股定理,a^2 + b^2 = c^2,且c>a>b,斜边比直角边长:
rightTriples = [ (a,b,c) | a <- [1..10], b <- [1..10], c <- [1..10], a^2 + b^2 == c^2]
最后添加条件周长为24:
rightTriples = [ (a,b,c) | a <- [1..10], b <- [1..10], c <- [1..10], a^2 + b^2 == c^2, a + b + c == 24]