Настоятельно рекомендуется всегда начинать проектирование функции Haskell с сигнатуры типа и только затем писать реализацию.В этом случае вы, вероятно, захотите
factorsOf :: Integer -> [(Integer, Integer)]
Итак, в пределах factorsOf n = ...
переменная n
будет иметь тип Integer
.Вот в чем проблема: вы пытаетесь получить квадратный корень из целого числа, но sqrt
определяется только для плавающих чисел.Поэтому вам нужно преобразовать в такое число , прежде чем получит root.После корня вы захотите усечь обратно до целого числа, но floor
уже делает это.toInteger
не требуется.
factorsOf :: Integer -> [(Integer, Integer)]
factorsOf n
= [ (x, n`quot`x)
| x <- [2 .. floor . sqrt $ fromIntegral n]
, n `mod` x == 0
]