列出 Haskell 类型的构造函数名称?

Dan*_*ton 4 reflection haskell

conNameOf允许我显示给定数据的构造函数名称,假设该类型是Generic.

我想要的是类似的东西。对于给定的类型,我想获取构造函数名称的完整列表。例如:

data Nat = Z | S Nat
  deriving (Generic)

-- constrNames (Proxy :: Proxy Nat) == ["Z", "S"]
Run Code Online (Sandbox Code Playgroud)

类似的东西constrNames存在吗?如果没有,我该怎么写?

K. *_*uhr 7

包中conNames模块的函数提供了这个功能。它采用给定类型的术语,但未使用其值,因此您可以使用:Generics.Deriving.ConNamesgeneric-derivingundefined

{-# LANGUAGE DeriveGeneric #-}

import GHC.Generics
import Generics.Deriving.ConNames
import Data.Proxy

data Nat = Z | S Nat deriving (Generic)

main = print $ conNames (undefined :: Nat)
Run Code Online (Sandbox Code Playgroud)

给出:

?> main
["Z","S"]
Run Code Online (Sandbox Code Playgroud)