gpt4 book ai didi

haskell - 动态获取某个类型的数据构造函数列表

转载 作者:行者123 更新时间:2023-12-01 11:23:48 26 4
gpt4 key购买 nike

我有一个这样的数据类型:
data ABCS = A Int | B Int | ... | Z Int deriving (Data, Typeable)
在测试中,我想动态提取所有构造函数,从每个构造函数中创建一个实例,然后运行测试。

我一直在看Data.TypeableData.Data ,但我还没有看到/理解如何仅从类型(ABC)开始执行此操作。

非常感谢帮助。

最佳答案

如果您同意使用 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

然后我们有例如
λ 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]

如果您不想使用 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)

...然后只需使用 enumFrom minBound :: [ABC]获取整个列表。简单!不确定这对你来说有多可行。

关于haskell - 动态获取某个类型的数据构造函数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39441509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com