Не удалось связать [Char] с реальным типом (возможно) - PullRequest
0 голосов
/ 05 февраля 2019

Итак, у меня есть это:

lstDelete :: [Char] -> Lst a -> Lst a
lstDelete k inp@(lstNode key)
    | k == key && lstIsEmpty = Map.delete key (Map.fromList inp)

Проблема в том, что k имеет тип [Char], а ключ имеет тип (может быть a):

data Lst a = lstNode (Maybe a)

Итак, яполучаю сообщение об ошибке:

Couldn't match expected type ‘[Char]’ with actual type ‘Maybe a’

Как это исправить, не меняя lstDelete :: [Char] -> Lst a -> Lst a?Я также хочу сохранить Maybe a, поскольку хочу, чтобы он тоже мог быть пустым.

1 Ответ

0 голосов
/ 05 февраля 2019

Существует несколько проблем с вашим кодом:

  1. Имена конструкторов должны начинаться с заглавной буквы.
    data Lst a = LstNode (Maybe a)

Ваш список может содержать только одно значение

lstDelete не имеет никакого смысла.Он принимает [Char] в качестве ключа и Lst a в качестве списка.Нет способа сравнить их (нет нетривиальной функции, которая может принимать эти параметры).Вам следует либо изменить тип на

   lstDelete :: [Char] -> Lst [Char] -> Lst [Char]

, либо написать более общий

   lstDelete :: Eq a => a -> Lst a -> Lst a
Map.fromList принимает [(k, v)], вы не можете передать ему Lst a. lstIsEmpty не определено.
...