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