Haskell:翻转功能的目的?

标签 haskell arguments flip

我有点惊讶,以前没有问过这个问题。也许这是一个愚蠢的问题。

我知道翻转正在改变两个参数的顺序。

例子:

(-) 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/

    相关文章:

    parsing - Haskell:如何将 IO 输入字符串解析为 Float(或 Int 或其他)?

    windows - Windows 上的 GHC + wxHaskell

    java - 如何声明并添加到全局数组列表?

    Swift 扩展,调用中参数 #1 缺少参数

    html - 使用纯 CSS 进行 3d 转换

    jquery - 在不破坏动画效果的情况下将 'flip card' div 放置在页面的不同部分

    haskell - 我在哪里可以学习高级 Haskell?

    haskell - protected 管道的行为与使用等待的管道相同吗?

    filter - graphql where filter - "Unknown argument\"where\"

    html - 水平翻转html和css