Haskell笔记 (五) 高阶函数

本文介绍了Haskell中的高阶函数,包括Map和Filter的使用,以及函数组合的概念。通过示例展示了如何利用匿名函数实现功能,阐述了函数式编程中的重要思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解高阶函数

高阶函数是Haskell的重要性质,同时也是所有函数式语言的共同性质,高阶函数实际上就是函数的函数,就是把某个函数作为另一个函数的参数的形式,就是高阶函数。

还是来看个例子吧, 取一个函数并调用它两次的函数 ,用数学表达式表达出来就是 f(f(x)),而在Haskell中写函数其实和数学上的表达式非常接近,这也是为什么说Haskell更加接近数学的原因。

applyTwice :: (a -> a) -> a -> a   
applyTwice f x = f (f x)

(a->a) 表示第一个参数是一个函数,这个函数输入是a类型,输出也是a类型,第二个参数a表示第二个参数是个变量,然后这个函数输出也是个变量。

再看第二行,f表示函数,这个appleTwice函数实际上就实现了 f(f(x))的功能,并且,在实际中,f是一个抽象概念,可以表示任意参数为变量的函数,这和数学上的f(x)非常相似,f(x)就是表示自变量为x的任意函数,所以我们在调用的时候可以这样。

applyTwice (+3) 10

表示,(10+3)+3,其中f(x)=x+3,所以f(f(x))=x+3+3。

当然,我们也可以来一个复杂一点的,这里就使用了匿名函数了。

applyTwice (\x->x^2+3) 10

这里,括号里面的就是匿名函数,这个概念应该大家都不陌生了吧,实际上整个函数就是 f(f(x))=(x^2+3)^2+3。

Map和 Filter

Map和Filter也是函数式编程中的重要组成部分,并且这个概念已经被很多命令行的编程语言所接纳了,比如Python中就有这两个概念。

Map就是从一组List中挨个取出元素,并把元素都执行指定的函数,然后生成一组新的List。

比如我们有一组List,[1,2,3,4,5,6],我需要将他们都平方以下,按照之前的做法,我们可以这么写:

[x^2 | x<-[1,2,3,4,5,6]]

如果我们用Map的形式,可以这么写:

map (\x->x^2) [1,2,3,4,5,6]

这就是Map,和上面的写法完全等价,但是显得更加明朗一些。

Fliter是输入参数是一个限制条件和一个 List,回传该 List 中所有符合该条件的元素。

比如我们要再一组List中找到大于3的所有数,按照之前的写法,我们可以这么来:

[x | x <-[1,2,3,4,5,6],x>3]

同样,如果用filter,可以这么写

filter (>3) [1,2,3,4,5,6]

Map和Filter是函数式编程的重要思想和方法,已经被借鉴到很多语言中,所以得认真掌握哦。。

函数组合

函数组合,实际上是一个简写函数的方式,比如一个List xs,我们需要依次调用a,b,c三个函数,那么我么可以这么写 c.b.a xs,实际上表示 c(b(a xs))

匿名函数

匿名函数我们就不具体说了,上面我们已经开始使用了,他的一般形式是:

  • \参数 -> 函数体,如 \x -> x^2+3
  • 匿名函数没有函数名


本教程参考了《Haskell趣学指南》,是这篇指南的学习笔记,不过参入了我自己的一些想法和总结,首先,感谢《Haskell趣学指南》的作者bonus 和大陆翻译者Fleurer和台湾翻译者MnO2,谢谢你们之前的工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值