У меня есть тип данных, который выглядит как
data G f n a where
G :: a -> G f n a -> G f (f n) a
Это контейнер, индексируемый натуральными значениями, который принимает функцию, которая определяет, как действовать индуктивно.
Я могу легко определить синоним типа, например
type G' n a = G S n a
Но я бы хотел использовать функцию идентификации.
Я пытался использовать Data.Functor.Identity, но даже после переопределения с помощью PolyKinds я не могу получить функцию уровня типа в Naturals (:k Identity => Nat -> Nat
), поэтому я обратился к семействам типов, определив
type family Id a where
Id a = a
который, круто, компилируется.К сожалению, я поставляю type G'' n a = G Id n a
и получаю сообщение об ошибке
The type family ‘Id’ should have 1 argument, but has been given none
In the type synonym declaration for ‘G''’
Так есть ли способ использовать семейство типов в синониме типа?Это похоже на идеальное конечное состояние.
(Используемые в настоящее время расширения {-# LANGUAGE GADTs, TypeFamilies, DataKinds, TypeInType, PolyKinds #-}
)