Почему этот тип на Хаскеле не компилируется? - PullRequest
0 голосов
/ 27 декабря 2018

Тьфу.Следующий код не может быть скомпилирован:

factorsOf number = [(x, quot number x) | x <- [2..toInteger $ floor $ sqrt number], number `mod` x == 0]

Выдается следующая ошибка:

  • "Нет экземпляра для (Floating Integer), возникающего из-за использования` sqrt '"

Пожалуйста, помогите?Я явно не придираюсь к принуждению на Haskell.

PS: при выключении toInteger компилируется, но выдает ошибку неоднозначности типов во время выполнения.

1 Ответ

0 голосов
/ 27 декабря 2018

Настоятельно рекомендуется всегда начинать проектирование функции 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
       ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...