Экземпляры класса и неоднозначное происшествие в Хаскеле - PullRequest
1 голос
/ 21 сентября 2011

Вот код:

data Tree t = NilT
            | Node t (Tree t) (Tree t)

instance Show (Tree t) where
  show NilT = ""
  show Node t l r = (show t) ++ ", " ++ (show l) ++ ", " ++ (show r)

как использовать «show» в «t show» с настройкой по умолчанию и использовать «show» с данными дерева с определением, данным мной?

Ответы [ 2 ]

4 голосов
/ 21 сентября 2011

Чтобы использовать show t, вы должны добавить ограничение Show t к определению вашего экземпляра.

instance Show t => Show (Tree t) where
    show NilT = ""
    show (Node t l r) = show t ++ ", " ++ show l ++ ", " ++ show r

Вы также пропустили скобки вокруг шаблона Node t l r, и я удалил скобкивокруг вызовов show, поскольку они были избыточными, поскольку приложение функции уже имеет самый высокий приоритет.

1 голос
/ 21 сентября 2011

Примечание: есть функция Data.List.intersperse для помещения значения между элементами списка.

show (Node t l r) = concat $ intersperse ", " [show t, show l, show r]

Или короче, как отметил Хаммар:

show (Node t l r) = intercalate ", " [show t, show l, show r]

К сожалению, вы не можете написать map show [t, l, r], поскольку элементы списка должны иметь уникальный тип.

...