Итак, я нахожусь в процессе изучения 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.
Спасибо за любую помощь.
И, пожалуйста, не давайте мне решение упомянутой задачи Эйлера проекта, я хочу сделать это сам, насколько смогу :). Спасибо.