Haskell如何自定义Show输出,不显示构造器仅获取newtype包装的字符串内容
解决方案
你可以通过以下几种常用方式实现需求:
方法1:手动写解包逻辑拼接字符串
不需要修改原有类型定义,直接通过模式匹配取出包装的字符串拼接即可:
-- 取出Prename中的字符串 getPrename :: Prename -> String getPrename (Prename s) = s -- 取出Surname中的字符串 getSurname :: Surname -> String getSurname (Surname s) = s -- 拼接Person的全名 getFullName :: Person -> String getFullName (P pre sur _) = getPrename pre ++ " " ++ getSurname sur
调用getFullName jondoe即可直接得到"John Doe"。
方法2:自定义Show实例,让show直接输出期望结果
如果你希望调用show jondoe就直接得到目标输出,删除Person类型定义后的deriving (Show),手动为Person定义Show实例即可:
data Person = P Prename Surname Employment -- 删掉原来的deriving (Show) instance Show Person where show (P (Prename preStr) (Surname surStr) _) = preStr ++ " " ++ surStr
此时调用show jondoe输出就是"John Doe"。
如果希望单独show一个Prename/Surname也不带构造器,可以同时给这两个newtype自定义Show实例:
instance Show Prename where show (Prename s) = s instance Show Surname where show (Surname s) = s
方法3:使用Record语法自动生成访问器
如果后续需要频繁访问Person的字段,可以把类型定义改为Record语法,编译器会自动生成字段的访问函数:
data Person = P { prename :: Prename , surname :: Surname , employment :: Employment }
配合方法2的自定义Show实例,你还可以用getPrename $ prename jondoe直接取出姓名字符串。
内容的提问来源于stack exchange,提问作者CoffeeKid
相关产品推荐
相关产品推荐

