2012-11-28 24 views
16

Ich frage mich, ob es in GHCi (oder anderswo) Funktionen gibt, um Typ Synonyme und Familien aus einem beliebigen Ausdruck zu erweitern.Erweitern Sie Synonyme, geben Sie Familien mit GHCi ein

Zum Beispiel, wenn ich diese Typen haben,

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 

dann würde Ich mag, um diese Art der Ausgabe in einer GHCI Sitzung zu erhalten.

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

Soweit ich das beurteilen kann, ist GHCi nicht wirklich etwas wie ein :texpand Befehl liefern, und ich bin nicht sicher, dass es die beste Schnittstelle für diese Informationen ohnehin wäre. Es ist jedoch wahrscheinlich, dass expandierte Typen irgendwie aus GHC extrahiert werden können, und ich möchte sie wirklich interaktiv sehen können.

Hacks, Dokumentationslinks, spekulative Diskussion über zukünftige Ergänzungen zu GHCi alle willkommen.

Antwort

17

:kind! wird das tun:

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

(Der Einfachheit halber können Sie so etwas wie :def k! \x -> return (":kind! " ++ x) in Ihrem .ghci setzen.)

+0

erwähnenswert, dass diese als von GHC 7.something neu ist. (4 oder 6, ich vergesse) –

+3

Das funktioniert bei mir in GHC 8.0.2 nicht. Es druckt nur den Typ-Alias ​​wie er ist ohne Expansion. – Hjulle

+0

Ich habe das gleiche Problem mit GHC 8.2.1 –

Verwandte Themen