`SInt16` 的符号 `show`

Symbolic `show` for `SInt16`

我正在寻找将 SInt16 变成 SString 的方法。对于我的用例,它对具体值做正确的事情就足够了,即我只会查看具体 SInt16SString 结果。

我注意到 SInt16 有一个 Show 实例,(当然)return 是 String。它几乎足以满足我的需求:对于符号值,它 returns "<symbolic> :: SInt16" 和具体值,例如42、它returns"42 :: SInt16"。因此,如果不是那个讨厌的类型标签,我可以使用 literal . show @SInt16 作为我的 SInt16 -> SString 函数。

有没有比编辑 show 的 return 值更好的方法来删除类型标签?

像这样应该可以解决问题:

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