У меня есть тип данных, который выглядит как
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 #-}
)