我在玩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 …