haskell笔记(3)

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 (++) []

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值