2015-11-04 63 views
-4
doubleMe :: Int -> Int 
doubleMe x = x + x 

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

我试图利用该功能doubleMe以获得双倍的xy总和。我究竟做错了什么?秩序的功能应用

新的代码无法编译:

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

看看'doubleUs2'再仔细。 –

回答

5

功能的应用程序具有比+和其他运营商更高的优先级,所以doubleMe x+y被解析为(doubleMe x)+y。要解决这个问题,请写doubleMe (x+y)

5

由于功能应用的优先级,你应该使用括号,还您doubleUs声明是错误的,因为它需要两个Int S:

doubleUs :: Int -> Int -> Int 
doubleUs x y = doubleMe (x+y) 
+0

够公平的,但是当我尝试编译这段代码时,我得到: [编译1]编译主(double.hs,解释) double.hs:8:14: 非法类型签名:'x y' 也许你打算使用ScopedTypeVariables 在图案类型的签名 double.hs:8:30:在范围: 'X' double.hs:8:32:在范围: 'Y' 失败,模块加载:无。 – user3050565

+0

你可以编辑你的原始文章并追加到它,你的新代码导致新的编译错误? – mac10688

+0

@ user3050565它适用于我,可能在你的'double.hs' –