Проблема с этим экземпляром очень проста. Вы дали подпись:
toList :: a -> [Integer]
Но ваш попытанный экземпляр действительно имеет тип Nodes a -> [a]
. Это не работает, если a
не является Integer
типом - но вы утверждали, что он работает для всех Integral a
. Это включает в себя другие типы, такие как Int
.
Одним из решений является ограничение вашего экземпляра:
instance ListConverter (Nodes Integer) where...
Это сработает, но, на мой взгляд, не совсем соответствует духу того, для чего вы, вероятно, предназначали этот класс.
Лучшее решение, которое я думаю, - это признать, что оба списка и ваш тип Nodes
параматеризованы другим типом, и определить класс таким образом, чтобы выполнить преобразование по общему базовому классу. Это звучит сложнее, чем есть, я просто имею в виду:
class ListConverter l where
toList :: l a -> [a]
Затем вы можете написать instance ListConverter Nodes where...
и просто скопировать существующее определение toList
. (Чья средняя линия, я укажу мимоходом, является излишней.)