Как уже указывал Виллем, причина ошибки заключается в том, что вы пытаетесь объединить значения неправильного типа с помощью оператора "cons" (:
). Подпись этого оператора (:) :: a -> [a] -> [a]
, а не (:) :: [a] -> [a] -> [a]
, что и делает ваш вызов.
Ваша tobase
функция возвращает тип [Int]
, и это первый аргумент, передаваемый оператору :
,Поскольку переменная типа a
в (:) :: a -> [a] -> [a]
имеет этот тип [Int]
в вашем вызове, компилятор ожидает, что второй аргумент будет [[Int]]
. Однако вы передаете [x `mod` b]
типа [Int]
. Вместо использования :
вы можете использовать ++
для объединения двух списков.
Как также отмечалось, порядок сопоставления с образцом в определении вашей функции должен быть обратным, поскольку второй регистр tobase b x | x `mod` b == x = [x]
никогда не будет достигнут,См http://learnyouahaskell.com/syntax-in-functions