Haskell:获取数据构造函数名称作为字符串

toh*_*ava 15 reflection haskell generic-programming ghc deriving

让我们说我们有

data D = X Int | Y Int Int | Z String
Run Code Online (Sandbox Code Playgroud)

我希望有一个功能 getDConst

getDConst :: D -> String
Run Code Online (Sandbox Code Playgroud)

根据用于输入的数据构造函数返回"X","Y"或"Z".是否有一种通用的方法来编写它而不必case对每个数据构造函数进行编写?(我可以使用依赖于Data.Typeable类似的解决方案)

toh*_*ava 17

自己找到了解决方案,但留下这个问题来帮助其他人:

import Data.Data
data D = X Int | Y Int Int deriving (Data,Typeable)

let result = show $ toConstr (X 3) -- result contains what we wanted
Run Code Online (Sandbox Code Playgroud)


Mat*_*hid 9

如果您不想使用Typeable,也可以使用Show.

getDConst :: D -> String
getDConst = head . words . show
Run Code Online (Sandbox Code Playgroud)

Show不会输出所有字段,因为它是懒惰的.您可以测试它运行此代码ghci:

Prelude> data D = D [Int] deriving (Show)
Prelude> getDConst $ D [1..]
"D"
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是"单词",而不是"unwords".(实际上,我会写一些像`takeWhile(/ ='').show`) (2认同)
  • 如果有人修改默认情况下实现 show 的方式它不起作用......这个解决方案依赖于约定 (2认同)