Отображение неизвестного типа в Хаскеле (основной)
В настоящее время я изучаю 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
и компилятор проверит это и выдаст ошибку, если это не так.