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)
如果您不想使用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)
| 归档时间: |
|
| 查看次数: |
2090 次 |
| 最近记录: |