Символическое `show` для` SInt16`

Я ищу способ превратить SInt16 в SString. Для моего случая использования достаточно того, что он делает правильные вещи для конкретных значений, т.е. я буду смотреть только наSString результат для бетона SInt16с.

Я заметил, что есть Show пример для SInt16, который (конечно) возвращает String. Его почти достаточно для моих нужд: для символьных значений он возвращает"<symbolic> :: SInt16" и для конкретных значений, например 42, он возвращает "42 :: SInt16". Итак, если бы не этот надоедливый тег типа, я мог бы использоватьliteral . show @SInt16 Как мой SInt16 -> SString функция.

Есть ли лучший способ, чем редактировать возвращаемое значение show вырезать тег типа?

1 ответ

Решение

Что-то вроде этого должно помочь:

import Data.SBV
import Data.SBV.String

toString :: (SymVal a, Show a) => SBV a -> SString
toString = literal . maybe "<symbolic>" show . unliteral

Я получил:

*Main> toString (2 :: SInt16)
"2" :: SString
*Main> toString (uninterpret "n" :: SInt16)
"<symbolic>" :: SString
Другие вопросы по тегам