У меня проблема со следующим кодом на Haskell - PullRequest
1 голос
/ 17 октября 2019

Я не знаю, что не так с кодом. Я только начал писать код на Хаскеле, так что извините за беспокойство.

tobase :: Int -> Int -> [Int]

tobase b x = tobase b (x `quot` b) : [x `mod` b]
tobase b x | x `mod` b == x = [x]
  Couldn't match expected type ‘[Int]’ with actual type ‘Int’
  In the expression: x `mod` b
  In the second argument of ‘(:)’, namely ‘[x `mod` b]’
  In the expression: tobase b (x `quot` b) : [x `mod` b]

1 Ответ

1 голос
/ 29 октября 2019

Как уже указывал Виллем, причина ошибки заключается в том, что вы пытаетесь объединить значения неправильного типа с помощью оператора "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

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