Отображение неизвестного типа в Хаскеле (основной)

В настоящее время я изучаю Haskell, и у меня есть трудности с задачей.

У меня есть непустое двоичное дерево, которое выглядит так

data STree a = BinS (STree a) a (STree a) | LeftS (STree a) a | RightS a (STree a) | LeafS a    

Все, что я сейчас пытаюсь сделать, это понять, как вывести это дерево.

Что касается начала, я просто хочу вывести чехол для LeafS a

Я пробовал это

instance Show (STree a) where
show (LeafS b) = show b

Я просто не знаю, как преобразовать этот неизвестный тип в строку, которую я могу вывести. Я пытался показать, распечатать, все, что я могу придумать, но ничего не работает.

Позже дерево будет содержать только целые числа, но я должен сделать это с помощью типа...

Вот что я хочу: LeafS 2 ~> "2" LeafS "100" ~> "100"

1 ответ

Решение

Не каждый тип может быть showв Хаскелле. Некоторые типы не могут быть показаны по своей природе - например, тип Int -> Int - как ты это показываешь? Но некоторые типы просто еще не имеют реализации show, Так в общем, если у вас есть какой-то тип a о котором вы ничего не знаете, вы не можете предположить, что это может быть showп.

Для того, чтобы использовать функцию show по вашему типу a, вам нужно попросить компилятор убедиться, что тип a имеет экземпляр Show a, Для этого вы добавляете ограничение к вашему экземпляру, например так:

instance Show a => Show (STree a) where
    show (LeafS b) = show b
    ...

Потому что вы указали Show a =>Компилятор знает, что данный тип STree a является примером Show класс тогда и только тогда, когда тип a сам по себе есть. Это позволяет компилятору вызывать show b и будьте уверены, что когда все типы станут известны, этот вызов станет возможным. С другой стороны, любой, кто пытается show экземпляр STree a нужно будет убедиться, что существует экземпляр Show aи компилятор проверит это и выдаст ошибку, если это не так.

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