Haskell's type-defaulting rules default un tipo di variabile un con vincoli (C1 A, ..., Cn a) se:regole di tipo inadempiente generalizzate
- Il tipo di variabile un appare in nessun altro vincoli
- Tutte le classi Ci sono standard.
- Almeno una delle classi di Ci è numerico
Questo ha senso per me, ma è anche molto limitata: in pratica significa che devi sempre specificare il tipo quando si è ambigua quando si lavora con lezioni personalizzate. Ad esempio, questo non compila:
class (Show a) => MyShow a where
myShow :: a -> String
myShow = show
instance (MyShow a) => MyShow (Maybe a) where
myShow Nothing = "Nothing"
myShow (Just x) = "Just " ++ (myShow x)
main = print $ myShow Nothing -- ambiguous
GHCi estende questo insieme di regole in questo modo:
- Tutte le classi di Ci sono classi di tipo singolo parametro.
- Almeno una delle classi Ci è numerico, o è Mostra, Eq, o Ord.
e GHC ha un'estensione chiamata ExtendedDefaultRules che consentono queste regole. Tuttavia questa estensione è molto specifica: funziona solo su GHC e con classi standard. Ad esempio, si può pensare a librerie che non usano la libreria standard. In tal caso, l'estensione GHCi non funzionerà.
La mia domanda è: l'unico modo per estendere le regole di default del tipo di Haskell come fa GHCi è con le estensioni del compilatore? E più generico: c'è un modo per definire il tipo di default in base ad alcune regole sui vincoli in Haskell 98?
Non c'è modo di fare quello che vuoi. Se riesci a trovare un buon design, siamo tutti orecchie. L'attuale tipo di default è una verruca. – augustss
Qualcosa di simile: 'esempio (MyShow a) => MyShow (forse) se .... inadempiente (Int)' . Il compilatore può verificare se il tipo è ambiguo e in quel caso predefinito. Nel caso sopra Niente avrebbe tipo Forse Int. Ovviamente è possibile eseguire l'impostazione predefinita solo sui tipi che soddisfano i vincoli. – mariop
@mariop Capisco che tu sia entusiasta di questa idea, ma al momento sembra un po 'cotta. C'è molto da pensare, come: Cosa dovresti fare se ci sono molti vincoli che hanno tutti valori predefiniti diversi? In che modo gli utenti della biblioteca possono influenzare le scelte predefinite di una biblioteca per adattarsi meglio alle loro esigenze? Perché le istanze sono il luogo canonico giusto per allegare istruzioni predefinite? La tua soluzione può essere generalizzata a classi di tipo multiparametrico (e fundep e tipo famiglie)? Sono sicuro che ci sono molte altre domande difficili che una proposta completa dovrebbe anche affrontare. –