2012-11-28 7 views
16

Mi chiedo se esista funzionalità all'interno di GHCi (o altrove) per espandere tipi di sinonimi e famiglie da un'espressione di tipo arbitrario.Espandi i sinonimi di tipo, digita le famiglie con GHCi

Per esempio, se ho questo tipo,

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 

allora mi piacerebbe essere in grado di ottenere questo tipo di uscita in una sessione 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)))) 

Per quanto posso dire, GHCi in realtà non offrono nulla di simile un comando :texpand, e non sono sicuro che sarebbe la migliore interfaccia per le informazioni in ogni caso. Tuttavia, sembra probabile che i tipi espansi possano essere estratti da GHC in qualche modo, e mi piacerebbe davvero poterli vedere in modo interattivo.

Hacks, collegamenti alla documentazione, discussioni speculative sulle future aggiunte a GHCi sono tutte benvenute.

risposta

17

:kind! farà che:

λ> :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))) 

(Per comodità, si può mettere qualcosa di simile :def k! \x -> return (":kind! " ++ x) nel vostro .ghci.)

+0

la pena ricordare che questa è una novità come del GHC 7.something. (4 o 6, ho dimenticato) –

+3

Questo non funziona per me in GHC 8.0.2. Stampa solo gli alias di tipo così com'è, senza alcuna espansione. – Hjulle

+0

Ho lo stesso problema con GHC 8.2.1 –