onu*_*tas 1 haskell functional-programming
在Allen和Moronuki的Haskell一书中,在第240页,它被作为翻转函数的实现给出
myFlip :: (a -> b -> c) -> b -> a -> c
myFlip f = \ x y -> f y x
Run Code Online (Sandbox Code Playgroud)
但是,我不明白这是如何工作的?特别是,当我提供两个参数˚F为
flippedF = flip f
flippedF p q
Run Code Online (Sandbox Code Playgroud)
Haskell如何在实现中将p和q与x和y匹配?
它是一个lambda函数.它匹配输入.就像一个map (\x -> x+1) [1..10]匹配列表中的每个x.
因此,如果函数代替此形式,(\x y -> f x y) p q则它在两个输入元素上匹配.
正如您所定义的那样myFlip f = ??,无论何时您看到myFlip f某处都可以用定义替换它(如果参数被称为不同的参数f,您当然需要替换它).
所以,定义flippedF = myFlip f等同于flippedF = \x y -> f y x,或者正如我们通常所写的那样
flippedF x y = f y x
Run Code Online (Sandbox Code Playgroud)
(这实际上只是lambda配方的语法糖).然后flippedF p q,如果您进行求值,则x和和y分别替换为p和q,就像在任何其他函数调用中一样.
flippedF p q ? (let x = p; y = q in f y x)
? f q p
Run Code Online (Sandbox Code Playgroud)