1

我正在寻找一种将 anSInt16变成SString. 对于我的用例,它为具体值做正确的事情就足够了,即我只会查看具体值的SString结果SInt16

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

有没有比编辑的返回值show剪掉类型标签更好的方法?

4

1 回答 1

3

这样的事情应该可以解决问题:

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
于 2020-07-30T06:16:59.220 回答