2012-11-09 29 views
9

Ho difficoltà a comprendere i tipi di rango superiore rispetto a quelli di rango superiore. Il tipo è piuttosto semplice (grazie alla letteratura Haskell per questo) e io pensavo che il rango sia simile quando parliamo di tipi ma apparentemente no! Ho letto l'articolo di Wikipedia senza alcun risultato. Quindi qualcuno può spiegare cosa è un grado? e cosa si intende per rango superiore? Polimorfismo di rango superiore? come viene (se esiste)? Anche il confronto tra Scala e Haskell sarebbe fantastico.Tipo vs Classifica teoria dei tipi

risposta

11

Il concetto di rango non è realmente correlato al concetto di generi.

Il rango di un sistema di tipo polimorfico descrive dove possono apparire i tipi forall s nei tipi. In un sistema di tipo rank-1 forall s possono apparire solo al livello più esterno, in un sistema di tipo rank-2 possono apparire a un livello di nidificazione e così via.

Quindi, ad esempio, forall a. Show a => (a -> String) -> a -> String sarebbe un tipo rank-1 e forall a. Show a => (forall b. Show b => b -> String) -> a -> String sarebbe un tipo rank-2. La differenza tra questi due tipi è che nel primo caso il primo argomento della funzione può essere qualsiasi funzione che accetta un argomento visualizzabile e restituisce una stringa. Quindi una funzione di tipo Int -> String sarebbe un primo argomento valido (come una funzione ipotetica intToString), quindi una funzione di tipo forall a. Show a => a -> String (come show). Nel secondo caso solo una funzione di tipo forall a. Show a => a -> String sarebbe un argomento valido, ad esempio show sarebbe ok, ma non lo sarebbe intToString. Di conseguenza la seguente funzione sarebbe una funzione legale del secondo tipo, ma non la prima (dove ++ dovrebbe rappresentare stringa concatenazione):

higherRankedFunction(f, x) = f("hello") ++ f(x) ++ f(42) 

noti che qui la funzione f viene applicata a (potenzialmente) tre diversi tipi di argomenti. Quindi se f fosse la funzione intToString questo non funzionerebbe.

Sia Haskell che Scala sono Rank-1 (quindi la funzione sopra riportata non può essere scritta in quelle lingue) per impostazione predefinita. Ma GHC contiene un'estensione di linguaggio per abilitare il polimorfismo di Rank-2 e un altro per abilitare il polimorfismo di Rank-n per arbitrario n.

+0

non potremmo dire che i ranghi qualificano le variabili di tipo, mentre i tipi qualificano le costanti di tipo? – didierc

+0

@didierc Non sono abbastanza sicuro di cosa intendi, ma non penso. Sia le variabili di tipo che le costanti di tipo hanno tipi. – sepp2k

+1

È possibile codificare facilmente tipi di classifica più alti in scala. Vedi http://www.cs.ox.ac.uk/jeremy.gibbons/publications/scalagp.pdf, sezione 7.2. –