2013-05-10 4 views
3

Я уже довольно давно смотрю на этот код, и я не могу обойти это сообщение об ошибке.Haskell: Не ожидалось, что тип «Integer» с фактическим типом «Int»

divisors :: Integer -> [Integer] 
divisors n = [t | t <- [1..n], mod n t == 0] 

length' :: [a] -> Integer 
length' []  = 0 
length' (x:xs) = 1 + length' xs 

divLengths :: [(Integer, Integer)] 
divLengths = [(n, length' (divisors n)) | n <- [1..]] 

divLengths' :: [Integer] 
divLengths' = [length' (divisors n) | n <- [1..]] 

hcn :: [Integer] 
hcn = [n | n <- [1..], max (take n divLengths') == length' (divisors n)] 

"divisors" принимает целое число и возвращает список со всеми его делителями.

«длина» - это то же самое, что и встроенная «длина», только она возвращает целое число.

«divLengths» - это бесконечный список кортежей Integer и число его делителей.

«divLengths» возвращает число делителей чисел.

«hcn» должен быть бесконечным списком высококомпозитных чисел (если число делителей совпадает с максимальным количеством всех чисел делителей всех чисел (до проверяемого числа)).

Однако, я получаю эту ошибку при попытке загрузить .hs в GHCI:

Couldn't match expected type `Integer' with actual type `Int' 
In the first argument of `divisors', namely `n' 
In the first argument of length', namely `(divisors n)' 
In the second argument of `(==)', namely `length' (divisors n)' 

Можете ли вы помочь мне здесь?

С наилучшими пожеланиями, Lukas

ответ

9

Проблема заключается в том, что take принимает Int, так GHC выводит из того что n должен быть Int. Нет проблем, вы можете использовать fromIntegral для преобразования между любыми интегральными типами.

Существует также другая проблема с max, которая должна принимать два аргумента. Вероятно, вы использовали maximum, который вместо этого берет список.

попробовать что-то вроде этого:

hcn :: [Integer] 
hcn = [n | n <- [1..], maximum (take (fromIntegral n) divLengths') == length' (divisors n)] 
Смежные вопросы