2014-10-04 4 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) = ... 

Я рекомендую попробовать и , но первое почти всегда так, как это делается в дикой природе.

Смежные вопросы