Как я могу устранить эту ошибку переменной неоднозначного типа?

StackOverflow https://stackoverflow.com/questions/1571844

  •  21-09-2019
  •  | 
  •  

Вопрос

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

код:

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, если это вообще уместно.

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

Это было полезно?

Решение

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

(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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top