2015-11-04 61 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' –