You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:15:03