Haskell:为什么f1.f2 xy不工作?

use*_*349 1 haskell function-composition dot-operator

关于点运算符,我有点困惑.我有以下代码(用于测试):

test :: Int -> Int -> Int
test x y = f1 . f2 x y 
           where f1 n = n+1
                 f2 x' y' = x' * y'
Run Code Online (Sandbox Code Playgroud)

我认为它将首先执行(f2 xy),然后在该结果上执行f1,但它会抛出错误.谁能告诉我点运算符的确切定义以及等于f1的内容.f2 xy?(在没有点运算符的情况下编写)

最好的问候,Skyfe.

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

test :: Int -> Int -> Int
test x y = f1 . f2 x
           where f1 n = n+1
                 f2 x' y' = x' + y'
Run Code Online (Sandbox Code Playgroud)

但是该代码也会返回错误.

jam*_*idh 7

在Haskell中,中缀运算符的优先级始终低于函数应用程序,所以这一点

f1 . f2 x
Run Code Online (Sandbox Code Playgroud)

解析这样的

f1 . (f2 x)
Run Code Online (Sandbox Code Playgroud)

但是,f2 x不是类型函数(好吧,如果f2返回一个函数,可能就是这样,但一般来说,或者在你的问题中不是这样).由于(.)作用于函数,因此不起作用.

请改用($)

f1 $ f2 x
Run Code Online (Sandbox Code Playgroud)

  • @ user2999349- @luqui打败了它,问题不是你传入的参数(.),它是类型的不匹配`test xy`的类型(应该是一个Int)和什么`f1.f2 x`实际上是(它是`(Int-> Int)`).您可以将`y`放在RHS中(即 - 使双方都键入`Int`),或将其从LHS中删除(即 - 使双方键入`(Int-> Int)`以使定义一致. (2认同)