Sto cercando di rendere i tipi di schermi ghci per le mie librerie il più intuitivi possibile, ma sto incontrando molte difficoltà quando si utilizzano funzionalità di tipo più avanzate.Perché ghci desugar elenca gli elenchi e digita le famiglie? Questo può essere disabilitato selettivamente?
Diciamo che ho questo codice in un file:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data Container (xs::[*]) = Container
lo carico in ghci, poi digitare il seguente comando:
ghci> :t undefined :: Container '[String,String,String,String,String]
Purtroppo, ghci mi dà l'piuttosto brutto looking:
:: Container
((':)
*
String
((':)
* String ((':) * String ((':) * String ((':) * String ('[] *))))))
ghci ha rimosso lo zucchero per stringhe di livello del tipo. C'è un modo per impedire a ghci di farlo e darmi solo la versione carina?
In una nota correlata, consente di dire a creare un livello di tipo Replicate
funzione
data Nat1 = Zero | Succ Nat1
type family Replicate (n::Nat1) x :: [*]
type instance Replicate Zero x = '[]
type instance Replicate (Succ n) x = x ': (Replicate n x)
type LotsOfStrings = Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String
Ora, quando chiedo ghci per un tipo di utilizzo LotsOfStrings
:
ghci> :t undefined :: Container LotsOfStrings
ghci è bello e mi dà il bel risultato:
Ma se chiedo per la versione Replicate
d,
ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
sostituti ghci in per la famiglia tipo, quando non ha fatto che per il tipo di sinonimo:
:: Container
((':)
*
[Char]
((':)
* [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
Perché ghci facendo la sostituzione per tipo famiglia, ma non il sinonimo di tipo? C'è un modo per controllare quando ghci farà la sostituzione?
Poiché i sinonimi di tipo sono concepiti esclusivamente per il consumo umano, non sostituiscono perché riconoscono di aver creato il sinonimo di tipo perché si voleva scrivere/vedere il tipo in quel modo. Rende la sostituzione con la famiglia tipo perché le famiglie tipo sono in realtà sul calcolo/deduzione di un tipo, non sulla visualizzazione. – AndrewC
La soluzione al tuo problema è nella tua domanda - fai un sinonimo di tipo se vuoi abbreviare. – AndrewC
@AndrewC Ok, non ho mai capito che era una delle distinzioni tra i sinonimi di tipi e le famiglie, ma questo ha senso. Ciò lascia comunque il desugaring degli elenchi di tipi. –