In primo luogo, questa domanda non è specifica al 100% per Haskell, sentiti libero di commentare il design generale di typeclasses, interfacce e tipi.Perché Haskell non riesce a dedurre i typeclass del tipo di dati nelle firme delle funzioni?
Sto leggendo LYAH - creating types and typeclasses Quello che segue è il passaggio che sto cercando ulteriori informazioni su:
Data (Ord k) => Map k v = ...
Tuttavia, si tratta di una convenzione molto forte in Haskell mai aggiungere typeclass vincoli dichiarazioni di dati. Perché? Bene, perché non ne beneficiamo molto, ma finiamo per scrivere più vincoli di classe , anche quando non abbiamo bisogno di loro . Se inseriamo o non inseriamo il vincolo Ord k nella dichiarazione dei dati per Map k v, dobbiamo mettere il vincolo in funzioni che presuppongono che le chiavi in una mappa possano essere ordinate . Ma se non inseriamo il vincolo nella dichiarazione dei dati, non dobbiamo mettere (Ord k) => nelle dichiarazioni di tipo di tipo , non importa se le chiavi possono essere ordinate o non. Un esempio di tale funzione è toList, che prende solo un mapping e lo converte in un elenco associativo . La sua sigla di tipo è listList :: Map k a -> [(k, a)]. Se Map kv aveva un vincolo di tipo nella sua dichiarazione di dati , il tipo di toList dovrebbe essere toList :: (Ord k) => Map ka -> [(k, a)], anche se la funzione non esegue alcun confronto delle chiavi per ordine.
Questo inizialmente sembra logico, ma non c'è un lato positivo per avere la classe di caratteri associata al tipo? Se il typeclass è il comportamento del tipo, allora perché il comportamento dovrebbe essere definito dall'uso del tipo (attraverso le funzioni) e non del tipo stesso? Presumo che ci sia qualche meta-programmazione che potrebbe farne uso, ed è certamente una documentazione del codice piacevole e descrittiva. Al contrario, sarebbe una buona idea in altre lingue? Sarebbe ideale specificare l'interfaccia a cui l'oggetto dovrebbe conformarsi sul metodo, in modo tale che se il metodo non viene utilizzato dal chiamante, l'oggetto non deve conformarsi all'interfaccia? Inoltre, perché Haskell non può dedurre che una funzione che utilizza il tipo Foo
, debba inserire i vincoli di classe di caratteri identificati nella dichiarazione del tipo Foo
? C'è un pragma per abilitare questo?
La prima volta che l'ho letto, ha evocato un "è una risposta (o una soluzione alternativa)". Alla seconda lettura con qualche pensiero, sembrava intelligente. Alla terza lettura, disegnando un complotto al mondo OO, suonava di nuovo come un hack.
Quindi eccomi.
Sono abbastanza nuovo per Haskell, una breve spiegazione di ciò che un GADT sarebbe stato utile (o collegamento). –
Ho rielaborato quella sezione un po 'e ho aggiunto un collegamento alla documentazione di GHC per GADT. Se qualcun altro vuole prendere una crepa per una spiegazione migliore di ciò che sono GADT, sarebbe il benvenuto! – mithrandi