在Allen和Moronuki的Haskell一书中,在第240页,它被作为 flip 函数的实现给出了
myFlip :: (a -> b -> c) -> b -> a -> c
myFlip f = \ x y -> f y x
但是,我不明白这是如何工作的?特别是,当我将 f 的两个参数提供为
时flippedF = flip f
flippedF p q
Haskell如何在实现中将 p 和 q 与 x 和 y 匹配?
答案 0 :(得分:6)
它是一个lambda函数。它匹配输入。就像map (\x -> x+1) [1..10]
匹配列表中的每个x一样。
因此,如果函数而不是此形式(\x y -> f x y) p q
,则它会匹配两个输入元素。
答案 1 :(得分:5)
正如您已定义myFlip f = ،،
,只要您看到myFlip f
某处将其替换为定义(如果参数被称为与f
不同的参数),您就可以使用flippedF = myFlip f
当然需要替代它。)
因此,定义flippedF = \x y -> f y x
等同于flippedF x y = f y x
,或者我们通常会将其写为
flippedF p q
(这实际上只是lambda配方的语法糖)。如果您随后评估x
,y
和p
参数将分别替换为q
和flippedF p q ≡ (let x = p; y = q in f y x)
≡ f q p
,就像在任何其他函数调用中一样。
<figure>
<img src="" alt="">
<figcaption>
<p>Text</p>
</figcaption>
</figure>