14、高阶函数
高阶函数可以接受另一个函数作为参数,也可以把一个函数作为结果来返回。我们构造2个函数:
1、mycct1,将列表中的元素累加或累减,具体取决于做为第一个参数的函数是(+)还是(-)
------
mycct1 ::(Num a)=>(a->a->a)->[a]->a
mycct1 f []=0
mycct1 f (x:xs)=f x (mycct1 f xs)
加载后运行:
*Main> mycct2 (+) mycpd [1,2,3]
9
*Main> mycct2 (+) mycpd [1,2,4]
27
*Main> mycct1 (+) [1,2,8]
11
*Main> mycct1 (+) [2,2,8]
12
*Main> mycct1 (-) [2,2,8]
8
*Main>
2、mycct2,将列表中元素分别阶乘后累加或累减
mycproduct::Int->Int->Int
mycproduct myn mya
|myn<0=0
|myn==0=1
|myn==1=mya
|otherwise=mycproduct (myn-1) (myn*mya)
mycpd ::Int->Int
mycpd n=mycproduct n 1
mycct2 ::(Num a)=>(a->a->a)->(a->a)->[a]->a
mycct2 f1 f2 []=0
mycct2 f1 f2 (x:xs)=f1 (f2 x) (mycct2 f1 f2 gxs)
运行后,效果如下:
*Main> mycct2 (+) mycpd [1,2,3]
9
*Main> mycct2 (+) mycpd [1,2,4]
27
*Main> mycct2 (-) mycpd [1,2,4]
23
*Main>