Haskell自定义数据类型的自定义打印实现(Repl.it环境)
为Haskell的Length类型自定义Show实例实现自定义打印效果
你需要手动实现Show类的实例来定制打印格式,这里有两种简单的实现方式:
方式一:利用记录字段访问属性
因为你定义Length时用了记录语法,直接通过字段名就能访问实例的属性:
data Length = Length {value :: Double, unit_of_measurement :: String} instance Show Length where show len = show (value len) ++ " " ++ unit_of_measurement len
方式二:通过模式匹配解构实例
如果不想依赖记录字段,也可以直接对Length构造器做模式匹配,取出内部的值:
data Length = Length {value :: Double, unit_of_measurement :: String} instance Show Length where show (Length val unit) = show val ++ " " ++ unit
效果演示
比如你创建一个实例:
deskLength = Length 120.5 "centimeters"
运行print deskLength就会输出120.5 centimeters,而不是默认的Length {value = 120.5, unit_of_measurement = "centimeters"}。
如果需要区分类似Python中__repr__(精确、面向开发者)和__str__(友好、面向用户)的两种格式,你可以额外自定义一个函数,比如:
import Text.Printf toString :: Length -> String toString (Length val unit) = printf "%.2f %s" val unit
这样调用toString deskLength会输出120.50 centimeters,适合展示给普通用户;而show方法可以保留更精确的格式,方便调试。
内容的提问来源于stack exchange,提问作者NickS1
相关产品推荐
相关产品推荐

