Понимание списка Haskell с помощью «x взят из функции» - PullRequest
0 голосов
/ 17 апреля 2011

Код ниже, начинающийся с digits, возвращает список целых чисел.Код, начинающийся с altSumOfDigits, должен возвращать тот же список, но вместо этого Prelude жалуется на ошибку типа, которую я пока не понимаю.

Couldn't match expected type `a' against inferred type `Integer'


digits' :: Integer -> [Integer]
digits' 0 = []
digits' x = (x `mod` 10) : digits' (x `div` 10)

digits :: Integer -> [Integer]
digits 0 = [0]
digits x = reverse $ digits' x

altSumOfDigits :: Integer -> [a]
altSumOfDigits num = [ x | x <- (digits num)]

(я знаю, что altSumOfDigits num = [ x | x <- (digits num)]довольно бесполезен в этой форме. Я собираюсь расширить его функциональность выражением if и операциями над единственными целыми числами позже.) Любые объяснения, почему это не работает?

1 Ответ

4 голосов
/ 17 апреля 2011

Измените (или удалите) тип altSumOfDigits, чтобы получить [Integer].


Включение ошибки в вопросе является хорошей формой, и вот оно:

Couldn't match type `a' with `Integer'

Тип altSumOfDigits принимает список Integer, но возвращает список любого типа a в соответствии с объявленным вами типом. Так что это полиморфно в своем типе возврата.

Однако вы звоните digits из altSumOfDigits, что должно вернуть только список Integer. Таким образом, ваш altSumOfDigits не сможет вернуть ничего, кроме списка [Integer].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...