Haskell 函数应用的顺序

Haskell 函数应用的顺序,haskell,Haskell,我试图利用函数doubleMe来获得x和y之和的两倍。我做错了什么 未编译的新代码: doubleMe :: Int -> Int doubleMe x = x + x doubleUs :: Int -> Int doubleUs x y = doubleMe x+y 函数应用程序的优先级高于+和其他运算符,因此doubleMe x+y被解析为(doubleMe x)+y。要解决此问题,请编写doubleMe(x+y)由于函数应用程序的优先级,您应该使用括号,而且您的doubl

我试图利用函数
doubleMe
来获得
x
y
之和的两倍。我做错了什么

未编译的新代码:

doubleMe :: Int -> Int
doubleMe x = x + x

doubleUs :: Int -> Int
doubleUs x y = doubleMe x+y

函数应用程序的优先级高于
+
和其他运算符,因此
doubleMe x+y
被解析为
(doubleMe x)+y
。要解决此问题,请编写
doubleMe(x+y)

由于函数应用程序的优先级,您应该使用括号,而且您的
doubleUs
声明是错误的,因为它需要两个
Int
s:

doubleMe :: Int -> Int
doubleMe x = x + x

doubleUs :: Int -> Int -> Int
doubleUs x y = x*2 + y*2

doubleUs2 :: Int -> Int -> Int
doubleUs2 :: x y = doubleMe (x+y)

很公平,但是当我尝试编译这段代码时,我得到了以下结果:[1/1]编译Main(double.hs,expressed)double.hs:8:14:非法类型签名:“xy”可能您打算在模式类型签名double中使用ScopedTypeVariables。hs:8:30:不在范围内:“x”double.hs:8:32:不在范围内:“y”失败,加载的模块:无。您能编辑您的原始帖子并将导致新编译错误的新代码附加到帖子中吗?@user305065它对我有效,您的
double.hs
@user305065
doubleUs2::x y=doubleMe(x+y)
应该是`
doubleUs2 x y=doubleMe(x+y)
(注意缺少
)。再次仔细查看
doubleUs2
doubleUs :: Int -> Int -> Int
doubleUs x y = doubleMe (x+y)