2014-10-04 69 views
1

我在學習haskell,並且在理解錯誤信息的時候遇到了一些問題。此代碼將產生以下錯誤haskell函數疑難解答

data Term = Mul { factor :: Term, factor2 :: Term } 
      | Div { dividend :: Term, divisor :: Term } 
      | Add { summand :: Term, summand2 :: Term } 
      | Sub { minuend :: Term, subtrahend :: Term } 
      | Mon { exponent :: Int } 

value :: (Double, Term) -> Double 
value x (Mul a b) = (value x a) * (value x b) 
value x (Div a b) = (value x a)/(value x b) 
value x (Add a b) = (value x a) + (value x b) 
value x (Sub a b) = (value x a) - (value x b) 
value x (Mon a) = x^a 

錯誤:

Couldn't match expected type `Term -> (Double, Term)' 
      with actual type `Double' 
The function `value' is applied to two arguments, 
but its type `(Double, Term) -> Double' has only one 
In the first argument of `(+)', namely `(value x a)' 
In the expression: (value x a) + (value x b) 

我在做什麼錯?

回答

4

問題是您的類型簽名和定義不同意他們如何接受參數。

您需要可以寫在咖喱風格的類型簽名(推薦):

value :: Double -> Term -> Double 

或寫在uncurried風格的功能(非慣用語):

value (x, Mul a b) = ... 

我建議嘗試都,但前者幾乎總是在野外完成的。