Gre*_*aro 4 reflection haskell types
我有一个这样的数据类型:
data ABCS = A Int | B Int | ... | Z Int deriving (Data, Typeable)
在测试中,我想动态提取所有构造函数,从每个构造函数中创建一个实例,然后运行测试。
我一直在查看Data.Typeable和Data.Data,但我还没有看到/理解如何只从类型 (ABC) 开始执行此操作。
非常感谢帮助。
小智 6
如果您可以使用Data.Data,它适用于这个用例,但由于Int参数而有点笨拙。
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Data
import Data.Typeable
allCtors :: forall a. Data a => [Int -> a]
allCtors = map observeCtor $ dataTypeConstrs $ dataTypeOf (undefined :: a)
where
observeCtor :: Constr -> Int -> a
observeCtor c i = fromJust $ fromConstrM (cast i) c
Run Code Online (Sandbox Code Playgroud)
然后我们有例如
? data ABC = A Int | B Int | C Int deriving (Show, Data, Typeable)
data ABC = A Int | B Int | C Int
? map ($ 2) allCtors :: [ABC]
[A 2,B 2,C 2]
Run Code Online (Sandbox Code Playgroud)
如果您不想使用Data.Data,您可以使用GHC.Generics和-XDefaultSignatures
FWIW,如果您可以重构 ABC 以便 A、B、C 标签是它们自己的类型,那么您就不必处理任何这些问题...
data ABCTagged = ABCTagged ABC Int deriving Show
data ABC = A | B | C deriving (Show, Eq, Ord, Enum. Bounded)
Run Code Online (Sandbox Code Playgroud)
...然后只是enumFrom minBound :: [ABC]用来获取整个列表。简单!不确定这对你来说有多可行。
| 归档时间: |
|
| 查看次数: |
699 次 |
| 最近记录: |