Haskell中如何在列表推导式中使用高阶函数?
拆解Haskell列表推导式的执行过程
别担心,这个列表推导式看起来绕,拆成每一步就很清楚了!我们来逐个分析每个函数f的执行过程:
首先记住Haskell列表推导式的核心逻辑:按生成器的顺序依次遍历,先处理第一个生成器的每个元素,再针对该元素处理后续的生成器,最后把所有结果收集起来。
我们来看你的表达式:
[ f x | f<- [(+1),(*2),(3-)], x<-[1..(f 1)]]
第一步:处理第一个函数f = (+1)
这个函数的作用是给输入加1。
- 先计算
f 1:1 + 1 = 2,所以x的范围是[1..2],也就是x取1和2。 - 分别计算
f x:- 当
x=1时:1 + 1 = 2 - 当
x=2时:2 + 1 = 3
- 当
- 这部分得到的结果是:
[2, 3]
第二步:处理第二个函数f = (*2)
这个函数的作用是给输入乘2。
- 计算
f 1:1 * 2 = 2,所以x的范围还是[1..2]。 - 分别计算
f x:- 当
x=1时:1 * 2 = 2 - 当
x=2时:2 * 2 = 4
- 当
- 这部分得到的结果是:
[2, 4]
第三步:处理第三个函数f = (3-)
这个函数的作用是用3减去输入(注意Haskell中运算符作为函数时,(3-)等价于\x -> 3 - x)。
- 计算
f 1:3 - 1 = 2,所以x的范围依旧是[1..2]。 - 分别计算
f x:- 当
x=1时:3 - 1 = 2 - 当
x=2时:3 - 2 = 1
- 当
- 这部分得到的结果是:
[2, 1]
最后合并所有结果
把三部分的结果按顺序拼接起来:[2,3] ++ [2,4] ++ [2,1] = [2,3,2,4,2,1]
这就是你看到的最终返回值啦!如果还有其他列表推导式的问题,随时问~
内容的提问来源于stack exchange,提问作者xly0n
相关产品推荐
相关产品推荐

