haskell(20)

18、mapfilter

Map将函数操作应用在随后的列表中,filter根据第一个参数为条件对随后的列表进行过滤

Prelude> map (>5) [1,6,8,-1,10]

[False,True,True,False,True]

Prelude> map (+6) [1,6,8,-1,10]

[7,12,14,5,16]

Prelude> map (/6) [1,6,8,-1,10]

[0.16666666666666666,1.0,1.3333333333333333,-0.16666666666666666,1.6666666666666667]

Prelude> filter (>5) [1,6,8,-1,10]

[6,8,10]

Prelude> filter odd [1,3,435,88,11]

[1,3,435,11]

Prelude> 

19、Lambdas

Lambdas是标准的匿名函数。

Prelude> (\a b->a*b) 5 7

35

Prelude> (\a b->a+b) 5 7

12

Prelude> 

我们用\后跟参数名称,->后为函数体的方式还表示lambdas函数。

Prelude> map (\(a,b)->a+b) (zip [1,2,3] [4,5,6])

[5,7,9]

Prelude> 

Foldl函数的作用是从列表左边提取一个元素做为参与指定的函数运算的第二个参数,直到列表为空,foldr提取顺序相反,但是提取的元素做为参与函数运算的第一个参数。

*Main> mysum2 [1,3,2]

6

*Main> myreverse [1,2,3]

[3,2,1]

代码如下:


mysum2 :: (Integral a)=>[a]->a
mysum2 xs=foldl (\mys x->mys+x) 0 xs 
myreverse ::[a]->[a]
myreverse xs=foldr (\x mylist->mylist++[x]) [] xs

Foldr1foldl1以第一次读取的元素为开始值,然后再读取第二个元素做为fold的值。下面是从左到右累减(mysub1)和从右到左减(mysub2)的程序

*Main> mysub2 [7,5,8]

-4

*Main> mysub2 [7,5,1]

-11

*Main> mysub2 [7,5,9]

-3

*Main> mysub1 [7,5,8]

-6

*Main> mysub1 [7,9,8]

-10

*Main> 

代码为:

mysub1::(Num a)=>[a]->a
mysub1=foldl1 (\x y->x-y)
mysub2::(Num a)=>[a]->a
mysub2=foldr1 (\y x->x-y)

 scanl 结果的第一个元素为1,第二个元素为1+列表的第一个元素1:1+1=2,然后第三个元素为1+列表的第1和第2个元素:1+1+3=5,以此类推

Scanrscanl类似但是从右边提取元素列表,生成的结果也是从右边开始排列元素。

*Main> scanr (+) 1 [1,3,5,11]

[21,20,17,12,1]

1做为从右边起第一个元素,然后1+11做为从右边起第二个元素,1+11+5做为从右边起第三个元素


本博客所有内容是原创,未经书面许可,严禁任何形式的转载。

http://blog.csdn.net/u010255642




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值