如何覆盖Haskell中显示某些基本类型的实例?

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中的数字"的答案.

ehi*_*ird 6

不,没有newtypes 就没有办法实现这个目标; 实例无法覆盖.

如果你真的想要这个,我会建议你定义自己的类型类ShowHex,就像Show所有实例都以十六进制打印一样.但是,我认为你的Show实例不正确; Show实例设计用于调试和序列化,并应输出语法上有效的代码.1你的没有,所以我建议你定义你自己的类型类来显示这些值,或者只是使用一个函数.

修改代码以此为基础是不切实际的; 这种实例的语义变化不仅会破坏很多软件包,而且让GHC实际使用您的修改版本也是一件非常痛苦的事情.

1理想情况下,它们生成的代码应该是语义上有效的Haskell,它产生一个比较等于show输入的值,但这并不是绝对必要的.

  • @Nybble您可以使用`:set -interactive-print = myPrint`覆盖ghci中的默认打印功能。将其放在`〜/ .ghci`中以始终覆盖它。 (2认同)

ham*_*mar 5

这将滥用Show实例.它不是真正意义上的格式.如果要以十六进制显示某些内容,只需使用函数进行转换即可.例如,您可以使用showHexfrom Numeric来制作这样的小帮手:

> import Numeric
Numeric> let hex x = showHex x ""
Numeric> hex 123456
"1e240"
Run Code Online (Sandbox Code Playgroud)