Ошибка Не удалось сопоставить ожидаемый тип '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 также.

Другие вопросы по тегам