Я полагаю, в вашей программе есть ошибка в toDataTree
, и вы имели в виду:
| edges /= DM.empty = ...
Однако вам не нужно Eq
экземпляров, чтобы проверить, что карта пуста. Если вместо этого вы используете DM.null
, вы можете удалить ограничения Eq
с toDataTree
и с экземпляра Show
:
toDataTree :: Trie a -> DT.Tree a
toDataTree (Node label edges isFinal)
| not (DM.null edges) = DT.Node label
(map toDataTree (DM.elems edges))
| otherwise = DT.Node label []
На самом деле, если карта пуста, то отображение ее элементов в любом случае создаст пустой список, так что вы можете еще больше упростить это до:
toDataTree :: Trie a -> DT.Tree a
toDataTree (Node label edges isFinal)
= DT.Node label (map toDataTree (DM.elems edges))
В любом случае, это должно решить вашу непосредственную проблему.
Если оставить все это в стороне, причина ошибки в том, что вы не предоставили ни одного экземпляра Eq
для Trie
. Вы можете добавить предложение deriving (Eq)
в определение для Trie
:
data Trie a = Node {
label :: a,
edges :: DM.Map a (Trie a),
isFinal :: Bool
} deriving (Eq)
Это может дать вам страшное предупреждение о хрупких внутренних привязках, но вы можете удалить ограничения Eq (Trie a)
(поскольку они будут подразумеваться ограничением Eq a
) как из экземпляра Show
, так и из toDataTree
, чтобы сделать предупреждение исчезнет.
Тем не менее, как уже упоминалось, вы на самом деле не хотите этого делать, потому что лучше использовать DM.null
и полностью обходить экземпляры Eq
.