f :: Int -> Int
f x = 2*x + 1 <==> lambda x . (2x + 1) <==> \x -> (2*x + 1) (x是输入,.后面是输出)
f = \x -> (2*x + 1)(箭头后面的是f x,是输出)
filter isEven [1..n] <==> filter (\x -> (mod x 2 == 0)[1..n] <==> [ x | x <- [1..n], mod x 2 == 0]
isEven x = mod x 2 == 0 <==> isEven = \x -> (mod x 2 == 0)
f, x, f x (f(x))
[2*x + 1 | x <- [1..n]) <==> map (\x -> (2*x+1)) [1..n]
兰姆达(lambda)表达式:
二元函数的例子:
add x = \y -> (y+x)
add = \x -> (\y -> (y+x)) <==> \x \y -> (x+y) <==> \x y -> (x+y)
(.) :: (b -> c) -> (a -> b) -> a -> c
f :: Int -> Int
isEven :: Int -> Bool
f . isEven x
isEven . f :: Int -> Bool
isEven . f x = isEven (f x)
g . f x = g (f x)
函数复合时,f . g x 有类型错误
使用时应(f . g) x 或者 f . g $ x
foldr :: (Int -> Int -> Int) -> Int -> [Int] -> Int
–folder :: (a -> b -> b) -> b -> [a] -> b
foldr f z [] = z
foldr f z (x:xs) = f x (folder f z xs)
sum [] = foldr (+) 0 []
sum (x:xs) = foldr (+) 0 (x:xs)
sum xs = foldr (+) 0 xs
–调用时,输入foldr (+) 0 [1..10]
product xs = foldr (*) 1 xs
foldr f z (a : b : c : []) = a f
(b f
(c f
z)) (f
:中缀函数)
and xs = foldr (&&) True xs
或
and = foldr (&&) True –point-free
my_maximum :: Ord a => [a] -> a
my_maximum [x] = x
my_maximum (x:xs) = (my_maximum xs)
将列表里的列表连接起来
concat :: [[a]] -> [a]
concat = foldr (++) []