Развернуть типы синонимов, типа семей с GHCi - программирование
Подтвердить что ты не робот

Развернуть типы синонимов, типа семей с GHCi

Мне интересно, существует ли в GHCi (или в другом месте) функциональность, чтобы расширить синонимы типов и семейства из выражения произвольного типа.

Например, если у меня есть эти типы,

data A = A
data B = B

data F a = F a
data G a = G a
data H a b = H a b

type S a b = H (F a) (G b)
type T a = S (a) (H B a)

type family R a :: *
type instance R (H a b) = H b a

то я хотел бы иметь возможность получить этот вид вывода в сеансе ghci.

> :t undefined :: T (S B A)
undefined :: T (S B A) :: T (S B A)

> :texpand undefined :: T (S B A)
undefined :: T (S B A) :: H (F ((H (F B) (G A)))) (G (H B (H (F B) (G A))))

> :texpand undefined :: R (T (S B A))
undefined :: R (T (S B A)) :: H (G (H B (H (F B) (G A)))) (F ((H (F B) (G A)))) 

Насколько я могу судить, GHCi фактически не предоставляет ничего подобного команде :texpand, и я не уверен, что в любом случае это будет лучший интерфейс для этой информации. Тем не менее, кажется вероятным, что расширенные типы могут быть извлечены из GHC каким-то образом, и я действительно хотел бы иметь возможность видеть их в интерактивном режиме.

Приветствия, ссылки на документацию, спекулятивное обсуждение будущих дополнений к GHCi приветствуются.

4b9b3361

Ответ 1

:kind! сделает это:

λ> :kind! T (S B A)
T (S B A) :: *
= H (F (H (F B) (G A))) (G (H B (H (F B) (G A))))
λ> :kind! R (T (S B A))
R (T (S B A)) :: *
= H (G (H B (H (F B) (G A)))) (F (H (F B) (G A)))

(Для удобства вы можете положить что-то вроде :def k! \x -> return (":kind! " ++ x) в свой .ghci.)