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>