I tipi sono cancellati in Haskell?

13

Haskell ha una nozione di "funzioni generiche" che ha qualche apparente somiglianza con la comune lisc - non avendo né esperienza con Haskell né con la comune focalizzazione, potrei essere molto approssimativo qui. Ciò significa che è possibile definire una generica funzione to_string per definire una rappresentazione stringa per tutti i tipi. Ovviamente, la funzione deve essere definita nei casi speciali, ma esiste una funzione to_string la cui firma è α → string .

I tipi cancellati in Haskell, così come sono in OCaml? In caso affermativo, in che modo l'implementazione delle "funzioni generiche" in Haskell differisce da quella del Common Lisp, dove i tipi sono dinamici e quindi non cancellati?

Capisco che i dettagli di implementazione siano specifici del compilatore, ma probabilmente ci sono disposizioni comuni a molte o tutte le implementazioni.

    
posta user40989 09.12.2013 - 11:29
fonte

2 risposte

16

La risposta finora è fuorviante.

È necessario distinguere tra polimorfismo "parametrico" e "sovraccarico ad hoc". Parametrico significa "si comporta in modo uniforme per tutti i tipi a", mentre "ad-hoc" - ciò che Simon definisce polimorfico - modifica l'implementazione in base al tipo.

Esempi di entrambi sono reverse :: [a] -> [a] , che è parametrico e show :: Show a => a -> String che è "ad-hoc" sovraccarico.

Se vuoi più di un'intuizione astratta, penso che aiuti a considerare le classi di verbi del linguaggio naturale che "funzionano" per tutti gli oggetti, come "possedere" o "pensare" che non pongono limiti all'oggetto , ma "aprire" richiede che ciò di cui stiamo parlando possa essere aperto. Posso 'pensare a una porta' e 'aprire una porta', mentre non ha senso ad es. 'apri un albero'. Per fare ancora un esempio, "aprire" è "polimorfico ad-hoc" come "aprire una finestra" e "aprire un ticket di reclamo con il servizio clienti" sono due cose molto diverse. Se questo sembra forzato - dimenticalo! Funziona per me.

Entrambi sono risolti in fase di compilazione, tuttavia, e di fatto "cancellati". Modulo varie estensioni GHC e Template Haskell, ecc. I tipi sono infatti cancellati in fase di compilazione e mai ispezionati in fase di esecuzione.

Le funzioni parametriche polimorfiche si comportano in modo identico per tutti i tipi, quindi è necessario generare solo un pezzo di codice, mentre il compilatore decide in fase di compilazione quale versione di una funzione "classificata" deve essere eseguita in un particolare punto di programma. Questo è anche il motivo per cui esiste la limitazione di un'istanza per tipo per classe di tipo e il corrispondente funzionamento "newtype".

L'implementazione è dettagliata in SPJ manuale e Wadler e Blotts paper sulle classi di tipi .

    
risposta data 09.12.2013 - 13:16
fonte
1

avviso: il mio background in CS non è molto strong, quindi potrei non sempre usare il vocabolario corretto, e potrei sbagliarmi su alcuni punti. Ad ogni modo, ecco la mia comprensione:

Penso che tu stia confondendo i generici con il polimorfismo.

I tipi generici come List<Foo> vengono utilizzati per descrivere tipi che prendono altri tipi come parametro e consentono un controllo più dettagliato del tipo.

Una funzione generica in haskell potrebbe essere count:: List a -> Int . Accetta elenchi di qualsiasi tipo e restituisce il numero di elementi. C'è solo un'implementazione.

Di solito, quando definisci List, non puoi assumere nulla su T. Puoi solo memorizzarlo e restituirlo.

La tua funzione to_string è una funzione polimorfica, il che significa che si comporterà diversamente in circostanze diverse. In haskell, questo viene fatto con i typeclass, che funzionano come gli aggettivi per i tipi.

Hai un Show typeclass, che definisce una funzione show :: a -> String .

Quando un tipo Foo implementa il Show typeclass, deve fornire la definizione di show . Questo tipo può quindi essere utilizzato nelle funzioni che richiedono il qualificatore Show (come in Show a => a -> whatever ). Haskell non può cancellare tipi, dal momento che queste funzioni devono trovare l'implementazione corretta della funzione show .

    
risposta data 09.12.2013 - 12:24
fonte

Leggi altre domande sui tag