小编Joo*_*kut的帖子

使用Data和Typeable获取构造函数的参数类型

我在玩Haskell的Data和Typeable,并且一直在尝试获取函数的参数而上下文中没有类型变量。

让我澄清一下我的意思。只要我按a如下方式量化类型变量,就可以使用fromConstr并获得DataType或TypeRep希望的列表:

constrArgs :: forall a. Data a => Constr -> [DataType]
constrArgs c = gmapQ f (fromConstr c :: a)
  where f :: forall d. Data d => d -> DataType
        f _ = dataTypeOf @d undefined
Run Code Online (Sandbox Code Playgroud)

(我认识到undefined和fromConstr并非总和,但懒惰在这里为我们节省了费用。)

但是,如果我尝试避免量化a,则无法再对的结果进行类型归因fromConstr。我想知道是否有一种方法可以编写具有以下类型签名的函数:

constrArgs' :: Constr -> [DataType]
Run Code Online (Sandbox Code Playgroud)

我的最终目标是编写一个函数,该函数给出DataTypes列表的列表,每个构造函数的子列表,每个子列表均包含该构造函数的参数类型。使用第一个版本,编写带有类型签名的函数并不困难:(取消定义)

allConstrArgs :: forall a. Data a => [[DataType]]
Run Code Online (Sandbox Code Playgroud)

问题是我无法应用于allConstrArgs自身的结果,因为没有办法将其DataType …

reflection haskell types generic-programming

3
推荐指数
1
解决办法
142
查看次数

标签 统计

generic-programming ×1

haskell ×1

reflection ×1

types ×1