myFlip f =\xy - > fyx如何工作?

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如何在实现中将pqxy匹配?

Joh*_*ker 6

它是一个lambda函数.它匹配输入.就像一个map (\x -> x+1) [1..10]匹配列表中的每个x.

因此,如果函数代替此形式,(\x y -> f x y) p q则它在两个输入元素上匹配.

  • 你是对的.我没有看到lamda表达作为一个整体功能.我的意思是如果auhor写的是"翻转f =(\ xy - > fyx)",对我来说会有问题.谢谢你的回答. (2认同)

lef*_*out 5

正如您所定义的那样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分别替换为pq,就像在任何其他函数调用中一样.

flippedF p q ? (let x = p; y = q in f y x)
             ? f q p
Run Code Online (Sandbox Code Playgroud)