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
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.
non potremmo dire che i ranghi qualificano le variabili di tipo, mentre i tipi qualificano le costanti di tipo? – didierc
@didierc Non sono abbastanza sicuro di cosa intendi, ma non penso. Sia le variabili di tipo che le costanti di tipo hanno tipi. – sepp2k
È 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. –