Ошибка Не удалось сопоставить ожидаемый тип 'Char' с фактическим типом '[Char]'
Я пытаюсь построить строковое представление для функции показа класса типов, представляющего полином. Я продолжаю получать ошибки типа несоответствия из 'Char' в '[Char]', но из моего понимания функция "добавления" haskell должна иметь возможность объединять Char в строку /[Char]. Я не понимаю, где проблема, или где искать решение, основанное на ошибках, которые я получаю. вот неисправный код:
newtype Poly a = P [a]
instance (Num a, Show a) => Show (Poly a) where
show p = ["" : form (p !! i) i | i <- [l,(l-1)..0]]
where
l = length p
form e i
| i == 0 = elem
| i == 1 = elem ++ "x + "
| otherwise = elem ++ "x^" ++ (show i) ++ " + "
where elem = show e
любая помощь будет принята с благодарностью, спасибо заранее.
1 ответ
Ты пишешь
Насколько я понимаю, функция "добавления" в haskell должна иметь возможность объединять Char в строку /[Char].
Я понятия не имею, откуда у тебя эта идея. Это не правильно. Я предполагаю, что вы определили
type Poly a = [a]
и я пойду с этим предположением.
instance (Num a, Show a) => Show (Poly a) where
Это не верно. Poly
это синоним типа. Вы можете объявлять экземпляры только для правильных первоклассных типов (применение конструктора типа к нулю или большему количеству переменных типа). Вы можете исправить это, используя вместо
newtype Poly a = Poly {getPoly :: [a]}
но тогда вам нужно обернуть / развернуть Poly
конструктор данных по мере необходимости. Как только вы поняли это правильно, вы, вероятно, увидите, что Num
ограничение, которое вы дали, не нужно.
show p = ["" ++ form (p !! i) i | i <- [(length p)..0]]
Есть несколько проблем. Главное, что это не определяет строку (список символов), а скорее список строк. Вы можете исправить это, как правило, применяя concat
к результату. Вторым является то, что "" ++ anything
просто anything
потому что конкатенация пустого списка с другим списком ничего не делает. Третья проблема в том, что вы пытаетесь считать, но вы сделали это неправильно. Эта запись только подсчитывает. Чтобы начать обратный отсчет, вы должны показать, что хотите отсчитать:
let lp = length p in [lp, (lp-1) .. 0]
Последнее, что я вижу сразу (некоторые из этих ошибок повторяются в предыдущих двух строках):
| otherwise = e ++ "x^" ++ i ++ " + "
Сейчас i
является Int
, а также ++
работает только для списков. Так что это не сработает. Вы должны сначала конвертировать i
к строке, используя show
, e
имеет тип a
и должен быть преобразован в строку, используя show
также.