Итак, я участвую в процессе обучения Haskell и часто падаю на ошибки типа/типа. Некоторые довольно очевидные глупые ошибки, а некоторые, которые заставляют меня чувствовать, что haskell не подходит для меня. Во всяком случае, у меня есть этот кусок коды ...Сравнение интегральных и плавающих значений
pfactors' ps n
| p > (sqrt n) = []
| m == 0 = p : (pfactors' ps q)
| otherwise = pfactors' (tail ps) n where
p = head ps
(q, m) = divMod n p
pfactors = pfactors' primes
main = print $ pfactors 14
(Некоторый фон:. Функция pfactors предполагается принять ряд и возвращает список простых чисел, которые являются главными факторами данного числа primes
бесконечный список простых чисел)
, который дает мне эту ошибку:
p47.hs:10:11:
Ambiguous type variable `a' in the constraints:
`Floating a' arising from a use of `pfactors'' at p47.hs:10:11-26
`Integral a' arising from a use of `primes' at p47.hs:10:21-26
Possible cause: the monomorphism restriction applied to the following:
pfactors :: a -> [a] (bound at p47.hs:10:0)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction
Теперь я понял, что это проблема с p < (sqrt n)
части, потому что это единственная часть, которая не имеет ничего общего с Floating
. Если я изменю его на p < n
, все будет хорошо, и я получу правильный ответ. Но я действительно хочу проверить квадратный корень, так как мне это сделать?
И кстати, это не домашнее задание, если он чувствует, как, это моя попытка решения 47-й проблемы на projecteuler.net
Спасибо за любую помощь.
И, пожалуйста, не дайте мне решение указанной проблемы эйлера проекта, я хочу сделать это сам, насколько смогу :). Благодарю.
waw, так много для так мало. Я попытался использовать 'floor $ sqrt', но я не поставил' fromIntegral', нужно привыкнуть к этому материалу, я думаю :). И да, я тоже должен ставить подписи типов :) –