Я пытаюсь написать функцию, которая проверяет, является ли число простым. Я написал это:Haskell Ошибка «Нет экземпляра для»
primeCheck :: Int -> Int -> Bool
primeCheck n i
| n == 2 = True
| i == 1 = True
| n `mod` i == 0 = False
| otherwise = primeCheck n (i -1)
isPrime :: Int -> Bool
isPrime n = primeCheck n (floor (sqrt n))
И я получаю эти ошибки:
Нет экземпляра для (RealFrac Int) , вытекающие из использования
floor' Possible fix: add an instance declaration for (RealFrac Int) In the second argument of
primeCheck 'а именно(floor (sqrt n))' In the expression: primeCheck n (floor (sqrt n)) In an equation for
IsPrime': IsPrime п = primeCheck п (этаж (SQRT п))No instance for (Floating Int) arising from a use of `sqrt' Possible fix: add an instance declaration for (Floating Int) In the first argument of `floor', namely `(sqrt n)' In the second argument of `primeCheck', namely `(floor (sqrt n))' In the expression: primeCheck n (floor (sqrt n)) Failed, modules loaded: none.
Когда я изменить код, чтобы это многообещающе фи х проблема:
primeCheck :: Int -> Int -> Bool
primeCheck n i
| n == 2 = True
| i == 1 = True
| n `mod` i == 0 = False
| otherwise = primeCheck n (i -1)
isPrime :: Int -> Bool
isPrime n = primeCheck n (floor (RealFrac (sqrt (Floating n))))
я получаю это:
Не в области видимости: конструктор данных `RealFrac '
Не в области видимости: данные конструктор` плавающей'
Как могу я исправить это?
На самом деле, после тестирования как в GHCi, так и в GHC, я обнаружил, что явная подпись типа приведения * не требуется, хотя я не знаю почему (особенно для GHC, поскольку GHCi имеет некоторые смешные правила дефолта). – crockeea
GHC имеет почти все правила по умолчанию; GHCi просто слегка смягчил условия, при которых он будет использовать типы по умолчанию, и по умолчанию некоторые вещи будут ('). См. Http://www.haskell.org/ghc/docs/7.6.3/html/users_guide/interactive-evaluation.html#extended-default-rules. Вы просто заметили это больше в GHCi, потому что компиляция одной строки за раз означает GHCi не может использовать весь модуль для вывода правильного типа, и поэтому выбор по умолчанию, а не тип выбирает ваши типы чаще. – Ben