18、map和filter
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
Foldr1和foldl1以第一次读取的元素为开始值,然后再读取第二个元素做为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,以此类推
Scanr与scanl类似但是从右边提取元素列表,生成的结果也是从右边开始排列元素。
*Main> scanr (+) 1 [1,3,5,11]
[21,20,17,12,1]
1做为从右边起第一个元素,然后1+11做为从右边起第二个元素,1+11+5做为从右边起第三个元素
本博客所有内容是原创,未经书面许可,严禁任何形式的转载。
http://blog.csdn.net/u010255642