2009-10-15 4 views
1

Следующий код компилируется нормально, но я не могу использовать функцию:Как я могу устранить эту ошибку неоднозначного типа?

КОД:

g :: (Fractional b, Integral b) => Int -> b -> b 
g 1 x = x/(g 2 x + 1) 
g 100 x = 2401*x/100 
g n x = ((map (\z -> (ceiling z)^2) (1:[0.5,1..]))!!(n-1))*x/((g (n+1) x) + fromIntegral n) 

ОШИБКА:

Ambiguous type variable `t' in the constraints: 
`Integral t' arising from a use of `g' at <interactive>:1:0-6 
`Fractional t' arising from a use of `g' at <interactive>:1:0-6 
Probable fix: add a type signature that fixes these type variable(s) 

Почему это происходит, и как можно Я обойду это? Я запускаю GHC 6.10.4 под Windows, если это вообще актуально.

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

ответ

4

Я не совсем уверен, что эта функция должна делать, но ваша проблема, кажется, что вы используете потолок, который имеет тип

(RealFrac a, Integral b) => a -> b 

Это заставляет весь результат быть в класс Integral, который, вероятно, не тот, который вы хотите. Добавление FromIntegral и тем самым изменяя последнюю строку

g n x = ((map (\z -> (fromIntegral $ ceiling z)^2) (1:[0.5,1..]))!!(n-1))*x/((g (n+1) x) + fromIntegral n) 

Делает функцию компиляции и дает ему тип

g :: (Fractional b) => Int -> b -> b 
+0

@Tirpen: Вы попали в ноготь на голове. Я понял, что «потолок» тоже был проблемой. К счастью, 'fromIntegral' существует, чтобы обойти такие сценарии. – Zaid

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