2011-01-09 9 views
6

Ive incontra alcune risposte (qui in SO) che affermano che Haskell ha molti "angoli bui" nel suo sistema di tipi e anche alcuni buchi disordinati. Qualcuno potrebbe elaborare su questo?Problemi nel sistema tipo di Haskell

Grazie in anticipo

+4

Cura di pubblicare collegamenti a tali risposte? –

+1

bene, http://stackoverflow.com/questions/3770774/what-language-to-learn-after-haskell e http://stackoverflow.com/questions/822752/should-i-learn-haskell-or- f-if-i-so-know-ocaml/823338 # 823338 – Ishihara

+0

Suppongo che la necessità di 'zip2, zip3, zip4' ecc sia un po 'problematica? –

risposta

13

Credo che dovrei rispondere a questa, soprattutto perché due persone finora hanno mal interpretato le mie osservazioni ...

Per quanto riguarda la non-terminazione, l'osservazione in questione era leggera iperbole per effetto drammatico, e di cui non terminazione al livello valore. Questo è stato nel contesto del confronto tra Haskell e teoremi dimostratori, in una risposta a qualcuno che ha menzionato le proprietà di correttezza di tipo come qualcosa che ha particolarmente apprezzato. In questo senso, la presenza di ⊥ che abita tipi altrimenti vuoti è un "difetto", perché cambia il significato di un tipo come A -> B da "dato un A, produce un B" in "dato un A, o produce un B o si blocca il programma "che è, per ovvi motivi, un po 'meno soddisfacente dal punto di vista della prova di correttezza.

È anche completamente irrilevante per quasi tutta la programmazione quotidiana e non peggio di qualsiasi altro linguaggio generico poiché, naturalmente, per la completezza di Turing è richiesta la possibilità di non terminare.

Non ho alcun problema con UndecidableInstances. In realtà, mi infastidisce meno di ⊥ a livello di valore, perché si blocca solo GHC durante la compilazione, non il programma finito. OverlappingInstances è un'altra questione, però, e il guazzabuglio ad hoc delle estensioni di GHC per fornire piccole parti di cose che richiederebbero naturalmente dei tipi dipendenti certamente si qualifica come "disordinato".

Ma tieni presente che la maggior parte delle cose di cui mi lamento in Haskell sono solo un problema a causa delle fondamenta altrimenti molto solide. La maggior parte dei sistemi di tipi in altri linguaggi tipizzati staticamente non sono nemmeno abbastanza coerenti da essere chiamati "sbagliati" in confronto, e ripulire il materiale che sto chiamando "disordinato" è un'area di ricerca attiva e continua.

+0

Grazie per il chiarimento. Sono rimasto sorpreso da quello che pensavo stessimo discutendo, ma non sono andato a cercare con cura di leggere la frase citata nel contesto. – sclv

+0

A livello di nitpicking, tra l'altro, distinguerei tra "crash del programma" e non terminazione. Ricorda il nostro slogan: i programmi ben tipizzati non vanno male! – sclv

+3

@sclv: In pratica, sì, assolutamente. Nel contesto della correttezza applicata per tipo, la distinzione tra diversi tipi di ⊥ sta ​​risistemando le sedie a sdraio sul Titanic. Probabilmente avrei dovuto dire qualcosa come "... o valuta a ⊥" invece, ma ... licenza poetica, immagino? –

1

Quindi ti riferisci Camccann dicendo "Sistema tipo di Haskell è pieno di buchi, a causa di nontermination e altri compromessi disordinato"? Penso che stia parlando dell'estensione UndecidableInstances e probabilmente di altre.

Poi hai fatto riferimento a Norman, posso solo supporre, dicendo "Il sistema di tipo di Haskell è ambizioso e potente, ma viene continuamente migliorato, il che significa che c'è una certa incoerenza come risultato della storia.". Sono sicuro che avesse in mente qualcosa, ma gli permetterà di chiarire quando vedrà questa domanda.

+0

Sospetto che Norman Ramsey stia parlando dell'interazione non completamente compresa tra varie estensioni sperimentali di GHC, in particolare cose come GADT, istanze sovrapposte, famiglie di tipi e quant'altro - roba che ho visto qualcuno (McBride, forse?) Si riferisce come un "guazzabuglio orribile". –

6

Il sistema di tipo Haskell non presenta problemi o buchi disordinati. Haskell 98 può essere completamente dedotto dal tipo. Possiede quella che è conosciuta come la proprietà del "tipo principale", vale a dire che ogni espressione data ha al massimo un singolo tipo più generale. Ci sono, tuttavia, una serie di espressioni che sono buone, utili e valide ma che non si digita in Haskell 98. La maggior parte di questi sono tipi di alto livello. forall a b. (a -> b) -> a -> b è un esempio (poco interessante) di tipo rank-one, il che significa che lo forall è solo all'esterno. forall b. -> (forall a. a -> a) -> b -> b è un esempio di tipo inutile ma possibile che non è di primo grado e non può essere espresso in Haskell98. I tipi di classificazione più alti sono una delle molte cose che infrangono la proprietà del tipo principale.

Come si aggiungono sempre più estensioni al sistema Haskell98 di base, cominciano a esserci dei compromessi tra la capacità di scrivere tipi veramente potenti che esprimono sia i diversi tipi di polimorfismo che i diversi tipi di vincoli e la capacità di avere tanto codice il più possibile completamente desunto dal tipo. Ai margini di ciò che è possibile, i tipi possono diventare complicati e, occasionalmente, è possibile imbattersi in cose che sembrano funzionare, ma non farlo. Ma a quel punto, si sta generalmente facendo ciò che è noto come "programmazione a livello di testo", in cui gran parte della logica dell'applicazione è stata incorporata nei tipi stessi e attraverso una combinazione di trucchi per la classe di tipizzazione in cui è stato inserito il compilatore, essenzialmente, eseguendo i tipi come programma in fase di compilazione.

Non sono d'accordo, tra l'altro, con l'affermazione di Camccann che la potenziale non-conclusione è un compromesso disordinato nel controllo del testo. Penso che sia una funzionalità perfettamente utile, in effetti un prerequisito per la tornitura-completezza a livello di tipo, e si rischia solo se si chiede esplicitamente al compilatore di iniziare a consentire molte cose oscure.

+0

Parlando di nitpicking - non esattamente pertinente alla domanda, ma sembra davvero molto strano quando la gente capitalizza il mio nome utente in questo modo, dal momento che è il mio primo nome iniziale di ++ ++ middle name. Probabilmente dovrei cambiare il mio nome visualizzato qui in qualcosa di più sensato [come uso altrove] (http://lambda-the-ultimate.org/user/7309). –

+0

@camccann - maiuscole minuscole :-) – sclv

+0

Non credo valga la pena di aggiungere una risposta completamente nuova solo per questo, ma forse potresti anche menzionare la restrizione del monomorfismo? Trovo che questa sia una complicanza piuttosto brutta del sistema di tipi che tende a mordere molti principianti. –

Problemi correlati