既然您了解所有内容都是一个参数函数,让我们从这一点开始。请记住,(\x y z -> x) 实际上是 (\x -> (\y z -> x)),而后者实际上是 (\x -> (\y -> (\z -> x))),但为了避免括号过多,让我们在第一步停止。
(f . g) x = f (g x)
因此
((\x -> (\y z -> x)) . (\a b -> a*b)) 2 =
(\x -> (\y z -> x)) ((\a -> (\b -> a*b)) 2) =
(\x -> (\y z -> x)) (\b -> 2*b) =
(\y z -> (\b -> 2*b))
现在请记住第二步并展开 (\y z -> ...):
(\y z -> (\b -> 2*b)) 3 4 =
(\y -> (\z -> (\b -> 2*b))) 3 4 =
-- \y -> ... given anything, returns a function \z -> ...
(\z -> (\b -> 2*b)) 4 =
-- \z -> ... given anything, returns a function \b -> ...
(\b -> 2*b)
最终的结果是:
(\b -> 2*b) 5 = 2*5 = 10
如果第一个函数返回 y 而不是 x,那么故事的情节会有所不同:
((\x -> (\y z -> y)) . (\a -> (\b -> a*b))) 2 =
(\x -> (\y z -> y)) ((\a -> (\b -> a*b)) 2) =
(\x -> (\y z -> y)) (\b -> 2*b) =
-- \x -> ... given anything, returns a function \y z -> ...
(\y z -> y)
所以你得到:
(\y -> (\z -> y)) 3 4 5 =
-- \y -> ... given anything, returns a function \z -> ...
(\z -> 3) 4 5 =
-- \z -> ... given anything, returns a constant 3
3 5 -- now still trying to apply 5 to 3
它试图将
3
视为一个可以接受
5
的函数。
(.).(.)
的细节,它是一个有趣的习语,用于组合多元函数。 - J. Abrahamson