Il sistema di tipo Haskell è un ostacolo alla comprensione della programmazione funzionale? [chiuso]

33

Sto studiando Haskell allo scopo di comprendere la programmazione funzionale, con l'aspettativa che applicherò l'intuizione che ottengo in altri linguaggi (principalmente Groovy, Python, JavaScript).

Scelgo Haskell perché ho avuto l'impressione che sia puramente funzionale e che non permetta alcuna dipendenza dallo stato.

Non ho scelto di imparare Haskell perché ero interessato a navigare in un sistema di tipi estremamente rigido.

La mia domanda è questa: un sistema di tipo strong è un sottoprodotto necessario di un linguaggio funzionale estremamente puro, oppure questa è una scelta progettuale non correlata in particolare a Haskell?

    
posta Eric Wilson 22.12.2010 - 04:24
fonte

7 risposte

40

Credo che la comprensione del sistema di tipo Haskell sia un amplificatore per comprendere la programmazione funzionale.

La cosa che riguarda la programmazione puramente funzionale è che in assenza di effetti collaterali, che ti permettono di fare ogni sorta di cose implicitamente, la programmazione puramente funzionale rende la struttura dei tuoi programmi molto più esplicita.

Haskell ti impedisce di spingere le cose sotto il tappeto, ti costringe ad affrontare la struttura del tuo programma in modo esplicito e ti insegna un linguaggio per descrivere queste strutture: il linguaggio dei tipi. Comprendere i tipi, in particolare i tipi ricchi come Haskell, ti renderà un programmatore migliore in qualsiasi lingua.

Se Haskell non fosse strongmente tipizzato, concetti come monadi, funtori applicativi e simili non sarebbero mai stati applicati alla programmazione.

    
risposta data 02.01.2011 - 12:49
fonte
33

Il linguaggio funzionale tipicamente più dinamico è probabilmente Scheme. Detto questo, il sistema di tipo di Haskell è un indicatore della sua purezza. Si tratta di "come si misura la purezza?". Il sistema di tipi di Haskell ti consente di isolare facilmente azioni impure in IO . Per fare ciò, è necessario un sistema di tipo statico.

Ma diciamo che il sistema di tipi di Haskell non ha nulla a che fare con la programmazione funzionale. Sarebbe comunque l'altezza della hybris sostenere che il sistema dei tipi non ti aiuterebbe in questo sforzo educativo. Il sistema di tipi di Haskell è ricco e complesso e ancor più interessante se confrontato con i sistemi di tipi di C ++ e OCaml.

È un ostacolo? No, penso che sia un vantaggio. Prova a considerare come gestire la pigrizia di Haskell senza IO , per esempio.

    
risposta data 22.12.2010 - 05:13
fonte
20

Clojure è tipizzato dinamicamente e quasi puro come Haskell, quindi c'è una buona argomentazione sul fatto che il sistema di tipi di Haskell fosse più una scelta progettuale che un requisito assoluto. Entrambi hanno sicuramente i loro punti di forza, quindi potresti considerare Clojure se non ti piace la rigidità di Haskell (ma vedi sotto).

Quando ho iniziato a utilizzare Haskell, ho considerato il sistema di tipi fastidioso e l'ho tollerato solo a causa dell'inferenza di tipo. Scoprimmo presto che molti errori di tipo il compilatore si lamentavano di cose che non avrebbero funzionato comunque anche se il compilatore mi avesse permesso di eseguirli (ad esempio usando accidentalmente map invece di concatMap). Ho poi scoperto che i programmi che hanno superato il controllo del tipo erano solitamente corretti, o almeno vicini alla corretta. Ho persino avuto una fase pigra in cui ho effettuato il refactoring cambiando un tipo di funzione e lasciando che il compilatore mi dicesse cos'altro doveva essere cambiato. Alla fine, mi sono reso conto che il sistema di tipo di Haskell era in realtà molto espressivo e ha iniziato a progettare i miei programmi attorno ai tipi. Questo è il Santo Graal di Haskell.

    
risposta data 02.01.2011 - 16:33
fonte
8

Il sistema di tipi di Haskell è fondamentale per la sua capacità di isolare gli effetti dal codice puro. A meno che non sia possibile isolare gli effetti in un altro modo o rimuovere completamente gli effetti, un sistema di tipo statico strong è un requisito per la pura programmazione funzionale.

Haskell è un ottimo esempio di linguaggio con un sistema di tipi statico strong. Se si desidera una formazione ampia e approfondita in informatica e programmazione del linguaggio in particolare, Haskell sarebbe una scelta eccellente come una delle lingue che dovresti imparare.

Il sistema dei tipi non dovrebbe essere un ostacolo enorme. Le persone che programmano tendono, anche quando usano linguaggi dinamici, seguono convenzioni di digitazione che possono essere codificate usando il sistema di tipi di Haskell. Haskell offre anche inferenza di tipo che allevia la verbosità rispetto a linguaggi come C ++ e Java. Quando ricevi un messaggio di errore, il compilatore ti dice solo al momento della compilazione che cosa ti dirà una lingua con tipi dinamici in fase di runtime.

L'opposto di un sistema di tipo dinamico è un sistema di tipo statico, non un sistema di tipo strong. Un sistema di tipo strong è l'opposto di un sistema di tipi deboli.

    
risposta data 02.01.2011 - 23:36
fonte
4

Ti dice subito quando fai errori stupidi. Questo è utile. Ho lavorato in Racket (Scheme) questo ultimo termine, e ci sono state un certo numero di volte in cui ho passato un s-exp non analizzato in cui mi aspettavo un pars anal a qualche funzione nel mio interprete, e si è mostrato solo nel mio suite di test di medie dimensioni. Se avessi una digitazione statica, sarebbe stata subito segnalata alla mia attenzione.

Ovviamente, gli errori logici non possono essere realmente rilevati dal sistema di tipi, ma il numero di modi in cui è possibile rovinare è notevolmente ridotto.

Inoltre, digitare inferenza ti consente di ignorare il sistema dei tipi, se lo desideri. È ancora lì, ma non richiede l'input attivo da parte dell'utente. È ancora utile capire i tipi di funzioni, ma il codice corretto funzionerà correttamente.

La purezza di Haskell è codificata nel suo sistema tipo. La monade IO è un costrutto di livello di tipo che impedisce al codice impuro di filtrare in pure funzioni, quindi la purezza è garantita dal sistema di tipi.

    
risposta data 22.12.2010 - 06:38
fonte
2

Essendo un linguaggio "funzionale", significa (a parte altre cose) che le funzioni sono oggetti di prima classe nella lingua.

Essendo un linguaggio "puro" significa che le funzioni sono funzioni matematiche (al contrario delle procedure) - dato lo stesso input, sempre producono lo stesso output.

Un "linguaggio puramente funzionale" è quello in cui entrambe le precedenti posizioni. Non sono a conoscenza di un "linguaggio funzionale puro ly ".

Un sistema di tipo strong è un modo pulito di avere un linguaggio puro e pratico. I tipi aiutano il compilatore a capire le ottimizzazioni, oltre a garantire ulteriormente la correttezza. (Ma, non è l'unico modo - il clojure è puro, ma non ha un sistema di tipi così strong come Haskell.)

Se il sistema dei tipi ti dà fastidio, ti suggerirei di provare un linguaggio più dinamico, come Scheme, o di usare il sistema di inferenza del tipo di Haskell.

    
risposta data 22.12.2010 - 06:03
fonte
0

Sì, il sistema dei tipi è una risorsa incredibile. Sarebbe molto difficile persino descrivere come funzionano le monadi o come funzionano alcuni combinatori senza il sistema dei tipi. Considera quanti tutorial su Haskell ti chiedono prima di considerare il tipo di funzione in questione con a: t al REPL. Questo semplicemente non è disponibile in una lingua digitata dinamicamente. Certo, tutta la complessità del sistema di tipi è ancora lì. Una monade è ancora una monade. Ma la lingua ha deciso di lavarsi le mani e non fornire alcun aiuto. Sei da solo, amico. Non sto bussando alle lingue digitate dinamicamente. Li amo molto. Schema è uno strumento di potere per eccellenza. Ma noterete che quando parliamo di cose come le monadi in linguaggi dinamici, spesso inventiamo una notazione per descrivere il tipo di procedure. Un programmatore funzionale combatterà con i tipi in un modo o nell'altro. Il correttore di tipi di Haskell ti offre solo buoni strumenti per imparare come farlo.

    
risposta data 08.07.2011 - 05:51
fonte