2013-07-24 12 views
6

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?

+3

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

+1

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

+1

@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. –

risposta

6

Non c'è modo di fare quello che vuoi.

La situazione attuale è impoverita dal design. L'idea era di fare qualcosa di minimo che potrebbe essere esteso in futuro quando avremo un buon design.

Problemi correlati