我有点惊讶,以前没有问过这个问题。也许这是一个愚蠢的问题。
我知道翻转正在改变两个参数的顺序。
例子:
(-) 5 3
= 5 - 3
= 2
flip (-) 5 3
= 3 - 5
= -2
但是为什么我需要这样的功能呢?为什么不手动更改输入?
为什么不直接写:
(-) 3 5
= 3 - 5
= -2
最佳答案
一个人不太可能使用 flip
立即应用于两个或多个参数的函数上的函数,但 flip
在两种情况下很有用:
ghci> foldl (-) 0 [1, 2, 3, 4]
-10
ghci> foldl (flip (-)) 0 [1, 2, 3, 4]
2
在这种情况下,我们不能交换
(-)
的参数。因为我们不申请(-)
直接地; foldl
为我们应用它。所以我们可以使用flip (-)
而不是写出整个 lambda \x y -> y - x
. flip
会很有用。将函数部分应用于其第二个参数。例如,我们可以使用 flip
编写一个构建无限列表的函数,该函数使用提供列表中元素索引的构建器函数:buildList :: (Integer -> a) -> [a]
buildList = flip map [0..]
ghci> take 10 (buildList (\x -> x * x))
[0,1,4,9,16,25,36,49,64,81]
也许更常见的是,当我们想要部分应用将使用高阶函数的第二个参数时使用它,就像在第一个示例中一样:
ghci> map (flip map [1, 2, 3]) [(+ 1), (* 2)]
[[2,3,4],[2,4,6]]
有时,而不是使用
flip
在这种情况下,人们会使用中缀语法,因为 operator sections具有可以为函数提供第一个或第二个参数的独特属性。因此,写 (`f` x)
相当于写flip f x
.就个人而言,我认为写作 flip
直接阅读通常更容易阅读,但这是个人喜好问题。 关于Haskell:翻转功能的目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51120910/