【问题标题】:Haskell : why f1 . f2 xy not working?哈斯克尔:为什么是 f1 。 f2 xy 不工作?
【发布时间】:2015-01-01 02:22:53
【问题描述】:

我对点运算符有点困惑。我有以下代码(用于测试):

test :: Int -> Int -> Int
test x y = f1 . f2 x y 
           where f1 n = n+1
                 f2 x' y' = x' * y'

我认为它会首先执行 (f2 x y) 然后 f1 在该结果上执行,但它会引发错误。谁能告诉我点运算符的确切定义以及等于 f1 的含义。 f2 x y? (不使用点运算符时)

最好的问候, Skyfe。

编辑:如果点运算符产生一个完整的新函数,我认为以下代码应该可以工作:

test :: Int -> Int -> Int
test x y = f1 . f2 x
           where f1 n = n+1
                 f2 x' y' = x' + y'

但该代码也会返回错误。

【问题讨论】:

    标签: haskell function-composition dot-operator


    【解决方案1】:

    中缀运算符的优先级总是低于 Haskell 中的函数应用,所以这个

    f1 . f2 x
    

    这样解析

    f1 . (f2 x)
    

    但是,f2 x 不是函数类型(好吧,如果 f2 返回一个函数,则可能是这样,但通常情况并非如此,或者在您的问题中)。由于 (.) 作用于函数,这将不起作用。

    改用 ($)

    f1 $ f2 x
    

    【讨论】:

    • 啊谢谢我明白了!所以这意味着点运算符从 2 个函数创建一个新函数,但是为什么我的第二个代码不起作用? f1 。因此 f2 x 将被解析 f1 。 (f2 x),其中 f2 x 将是一个仍需要一个参数的函数,这将是 y 参数,就像 f1 一样。
    • @user2999349,在这种情况下你需要说test x =而不是test x y =
    • @user2999349-@luqui 打败了我,问题不在于您传递给 (.) 的参数,而是 test x y 类型的预期类型不匹配(应该是一个 Int)和 f1 . f2 x 实际上是什么(它是 (Int->Int))。您可以将 y 放在 RHS 中(即,两边都输入 Int),或者将其从 LHS 中删除(即,两边都输入 (Int->Int) 以使定义一致。
    【解决方案2】:

    一种常见的方法是将(.)($) 结合起来:

    f1 . f2 $ x
    

    这可以很容易地扩展以建立更长的“管道”:

    f1 . f2 . f3 . f4 $ x
    

    然后,如果您发现自己在其他地方需要相同的组合,则只需剪切和粘贴:

    fs = f1 . f2 . f3 . f4
    
    ... fs x ... fs y
    

    【讨论】:

      【解决方案3】:

      (我认为其他答案提出$ 太快了)

      如你所知,

      f1 . f2 x
      

      被解析为

      f1 . (f2 x)
      

      (f1 . f2) x
      

      改为执行它所读取的操作:组合 f2f1,然后将此组合函数应用于 x。现在

      ($) :: (a -> b) -> a -> b
      f $ x = f x
      

      看起来是多余的。它的主要目的是它具有最低的优先级,因此您可以避免使用括号:

      foo . bar . baz $ x + y * z = (foo . bar . baz) (x + y * z)
      

      另请参阅:Haskell: difference between . (dot) and $ (dollar sign)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-30
        • 2010-12-07
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多