Nyb*_*ble 5 haskell overriding
我正在Haskell中编写一些程序,处理很多基本类型,如Word32/Word64等.我使用ghci来频繁地测试函数,在终端中查看结果.
为方便快捷,我总是以十六进制显示数据,例如
data Human = M Int | F Int
instance Show Human where
show M x = printf "man, age %d" x
show F x = printf "woman, age %d" x
Run Code Online (Sandbox Code Playgroud)
但我希望基本类型以十六进制显示(特别是在ghci中).我发现实例声明无法覆盖.而且我不想像他们一样扭曲所有人:
newtype MyInt = MyInt Int
instance Show MyInt where
...
Run Code Online (Sandbox Code Playgroud)
它看起来有点愚蠢.
我可以修改baseghc 包中的一些代码吗?我只想让一切都变成"十六进制".我只想要ghci显示"hex".我怎么能实现它?
由于我们所有人都同意覆盖Show不合适且不切实际,因此欢迎 任何"更好地以十六进制显示ghci中的数字"的答案.
不,没有newtypes 就没有办法实现这个目标; 实例无法覆盖.
如果你真的想要这个,我会建议你定义自己的类型类ShowHex,就像Show所有实例都以十六进制打印一样.但是,我认为你的Show实例不正确; Show实例设计用于调试和序列化,并应输出语法上有效的代码.1你的没有,所以我建议你定义你自己的类型类来显示这些值,或者只是使用一个函数.
修改代码以此为基础是不切实际的; 这种实例的语义变化不仅会破坏很多软件包,而且让GHC实际使用您的修改版本也是一件非常痛苦的事情.
1理想情况下,它们生成的代码应该是语义上有效的Haskell,它产生一个比较等于show输入的值,但这并不是绝对必要的.
这将滥用Show实例.它不是真正意义上的格式.如果要以十六进制显示某些内容,只需使用函数进行转换即可.例如,您可以使用showHexfrom Numeric来制作这样的小帮手:
> import Numeric
Numeric> let hex x = showHex x ""
Numeric> hex 123456
"1e240"
Run Code Online (Sandbox Code Playgroud)