本章着手于Haskell独特的语法结构
模式匹配
lucky :: (Integral a) => a -> String
lucky 7 = "Lucky Number"
lucky x = "sorry"
调用lucky时。模式会从上到下进行依次模式匹配,匹配成功则自动运行该句话,匹配失败则自动转到下一句模式匹配
--阶乘 (模式匹配中也可以使用递归)
factorial :: (Integral a) => a -> a
factorial 0 = 1
factorial n = n * factorial(n - 1)
-- 取元组的指定元素
first ::(a,b,c) -> a
first (x ,_,_) = x
second ::(a,b,c) - > b
second (_,y ,_) = y
third :: (a,b,c) ->c
third (_,_,z) = z
|| list 本身也是一个模式匹配,[1,2,3 ] 其实本质上是1:2:3:[ ]
因此list可以表示为 x : xs这种形式(当然使用x:y:xs 就可以绑定list前两个元素)
[x] == (x:[])
程序示例:
--
filter :: (a->Bool) -> [a] -> [a]
filter _ [] = []
filter p (x:xs)
|p x = x : filter p xs
|otherwise = filter p xs
--mytake :: (Eq) a => a ->[a] -> [a]
--mytake a [] = "error"
--mytake a [x]
--|a == x = []
--|otherwise = [x]
--mytake a (x:xs)
--|a == x =(xs)
--|otherwise = [x]:mytake a (xs)
|| as 模式(起别名)
将一个名字和“@” 置于模式前,可以将@后的整体通过该名称调用
capital :: string -> string
capital "" = "Empty string"
capital all@(x:xs) = "the first letter of " ++ all ++ " is " ++ [x]
|| Guards分支 (相当于if语句)
max' :: (Ord a) => a -> a -> a
max' a b
|a > b = a
|otherwise = b
compare' :: (Ord a) a -> a ->Ordering
a `compare' ` b
| a > b = GT
| a == b = EQ
| otherwise = LT
|| where关键字
对于程序来说是个局部变量,对于一个函数来说相当于全局变量,where 关键字跟在 guard 后面(最好是与竖线缩进一致),可以定义多个名字和函数。这些名字对每个 guard 都是可见的。
注意: 函数where的作用范围为本函数(包含所有guard在内的整个函数可见)
也可以where一个模式匹配:
|| let关键字
对于程序来说也是个局部变量,对于一个函数来说相当于局部变量,let绑定,定义局部变量,对不同的guard不可见
let in 表达式,let 中绑定的名字仅对 in 部分可见。
|| case 关键字
模式匹配的本质就是case语句的一种形式。以下代码等价
更灵活的使用
等价于