2015-12-29 3 views
1
fact :: Int -> Int 
fact x = if x == 1 then x else x * fact(x - 1) 

nterm :: Double -> Int -> Double 
nterm x i = x^i/fromInteger (fact i) 

solve :: Double -> Double 
solve x = sum [nterm x i| i <- [1..10]] + 1 

main :: IO() 
main = getContents >>= mapM_ print. map solve. map (read::String->Double). tail. words 

Я получаю ошибку follwing при выполнении вышеуказанного кода haskell. Что это значит ? Я понимаю, что тип, возвращаемый fromInteger (Integer), не такой, как тип, возвращаемый возвратом (Int). Как я могу это исправить?Как решить может не соответствовать ожидаемый тип в haskell

solution.hs:5:35: 
    Couldn't match expected type `Integer' with actual type `Int' 
    In the first argument of `fromInteger', namely `(fact i)' 
    In the second argument of `(/)', namely `fromInteger (fact i)' 
+2

replace fromIntegral –

ответ

3

Вы можете заменить fromInteger с fromIntegral.

fromInteger :: Num a => Integer -> a 
fromIntegral :: (Integral a, Num b) => a -> b 

Это работает, потому что Int соответствует Integral класса в то время как fromInteger принимает только Integer в качестве параметра.

+1

Возможно, стоит упомянуть альтернативное решение, которое заключается в предоставлении 'fact' более универсального типа. – gallais

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