Я играю с 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
(я понимаю,undefined
и fromConstr
не являются итоговыми, но лень спасает нас здесь.)
Однако, если я попытаюсь избежать количественного определения a
, я больше не смогу делать приписывание типа для результата fromConstr
.Интересно, есть ли способ написать функцию со следующей сигнатурой типа:
constrArgs' :: Constr -> [DataType]
Моя конечная цель - написать функцию, которая дает список списков DataType
s, подсписок для каждогоконструктор, каждый подсписок, содержащий типы аргументов этого конструктора.Используя первую версию, нетрудно написать функцию с сигнатурой типа: (определение исключено)
allConstrArgs :: forall a. Data a => [[DataType]]
Проблема в том, что я не могу применить allConstrArgs
к самим результатам, потому чтонет способа перейти от DataType
к значению уровня типа.
Итак, чтобы исправить это, можем ли мы написать функцию следующего типа?
allConstrsArgs' :: DataType -> [[DataType]]
Я огляделся в базовой библиотеке, но не вижу, как этого достичь.