Haskell 中的函数 - 理解
Functions in Haskell - Understanding
我有以下代码给出 [2,4,6]
:
j :: [Int]
j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3]
为什么?似乎只使用了“z 函数”,“y 函数”会怎样?
map
在这种特殊情况下如何工作?
让我们计算一下:
((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3]
^^^ f ^^^^^^^ ^^^ x ^^^^^
=
(map x) [1,2,3]
where f = \y -> y +3
x = \z -> 2*z
=
[x 1,x 2,x 3]
where f = \y -> y +3
x = \z -> 2*z
=
[2*1,2*2,2*3]
where f = \y -> y +3
x = \z -> 2*z
=
[2,4,6]
where f = \y -> y +3
x = \z -> 2*z
正如我们所见,f
被当作一个参数,但之后就再也没有被使用过。因此 \y -> y+3
从未影响最终结果。
函数map x
是将函数x
应用于列表的每个元素的函数。请注意,上面的 (map x) [1,2,3]
与 map x [1,2,3]
相同。实际上,每个函数应用程序 g x1 x2 x3 x4
都可以通过左关联应用程序等效地写成 (((g x1) x2) x3) x4
。
我有以下代码给出 [2,4,6]
:
j :: [Int]
j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3]
为什么?似乎只使用了“z 函数”,“y 函数”会怎样?
map
在这种特殊情况下如何工作?
让我们计算一下:
((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3]
^^^ f ^^^^^^^ ^^^ x ^^^^^
=
(map x) [1,2,3]
where f = \y -> y +3
x = \z -> 2*z
=
[x 1,x 2,x 3]
where f = \y -> y +3
x = \z -> 2*z
=
[2*1,2*2,2*3]
where f = \y -> y +3
x = \z -> 2*z
=
[2,4,6]
where f = \y -> y +3
x = \z -> 2*z
正如我们所见,f
被当作一个参数,但之后就再也没有被使用过。因此 \y -> y+3
从未影响最终结果。
函数map x
是将函数x
应用于列表的每个元素的函数。请注意,上面的 (map x) [1,2,3]
与 map x [1,2,3]
相同。实际上,每个函数应用程序 g x1 x2 x3 x4
都可以通过左关联应用程序等效地写成 (((g x1) x2) x3) x4
。