((f x) g) y
f :: A ->(B->C)
x :: A
f x :: B->C
y :: B->C
take n是取列表的前n项
drop n 是取列表去掉前n项后剩下的项
[] , ->, 元组 是类型运算
[Char]->[Char]->Bool <==> [Char]->([Char] ->Bool)
无名变量’_’, 如定义列表长度函数:
myLength :: [Int] -> Int
myLength [] = 0
myLength (x:xs) = 1 + length xs
也可用无名变量’_’:
myLength :: [Int] -> Int
myLength [] = 0
myLength (_:xs) = 1 + length xs
因为原来使用’x’的变量在右边不出现,用什么名都没关系
myMax x y = if x > y then x else y
也可写成: (注意等号写在每个条件后面)
myMax x y
| x > y = x
| otherwise = y
判断整数是否在列表中
myElem :: Int -> [Int] -> Bool
myElem x [] = False
myElem x (y : ys) = if (x==y) then True else myElem x ys
等价于myElem x (y :ys)
|x==y = True
|otherwise = myElem x ys
也可以写成
myElem x (y :ys) = (x==y) || myElem x ys
判断任意类型 特别注意,a应该支持==判断,故此处应有类型约束
myElem :: (Eq a)=>a -> [a] -> Bool (函数)重载,即让一个函数做不同的事情
myElem x [] = False
myElem x (y :ys)
|x==y = True
|otherwise = myElem x ys
图书馆借书程序
type Person = String
type Book = String
type DataBase = [(Book,Person)]
makeLoan :: DataBase -> Person -> Book -> DataBase
makeLoan db person book = (book,person) : db
–db ++ [(book,person )]
还书程序
returnLoan :: DataBase -> Person -> Book -> DataBase
returnLoan db person book = [ pair | pair <- db, pair /=(book , person)]
上面可用于列表删除
exampleDB :: DataBase
exampleDB = [(“C++”,”Wang”),(“Java”,”Trump”),(“Python”,”Gates”)]
newDB = makeLoan exampleDB “Gao Min” “Programming in Java”
newDB2 = returnLoan newDB “Wang” “C++”
books :: Person -> DataBase ->[Book]
books person db = [ b | (b,p) <-db ,p == person ]
搜索网站Hoogle,书real world haskell
乘方操作符(^)是对于整数的。如果要用浮点数作为指数,则需要操作符(**)
函数fromInteger :: Integer ->a 可以将一个类型为Int的数转为a类型