It's written che le tuple di Haskell sono semplicemente una sintassi diversa per i tipi di dati algebrici. Allo stesso modo, ci sono esempi su come ridefinire i costruttori di valori con le tuple.Qual è la differenza tra costruttori di valori e tuple?
Per esempio, un tipo di dati Albero in Haskell potrebbe essere scritto come
data Tree a = EmptyTree | Node a (Tree a) (Tree a)
che potrebbe essere convertito a "forma di tupla" come questo:
data Tree a = EmptyTree | Node (a, Tree a, Tree a)
Qual è la differenza tra il Node
costruttore di valori nel primo esempio e l'attuale tuple
nel secondo esempio? vale a dire Node a (Tree a) (Tree a)
rispetto a (a, Tree a, Tree a)
(a parte solo la sintassi)?
Sotto il cofano, è Node a (Tree a) (Tree a)
solo una sintassi diversa per una tupla di 3 tipi appropriati in ogni posizione?
So che è possibile applicare in parte un costruttore di valore, come Node 5
che avrà Tipo: (Node 5) :: Num a => Tree a -> Tree a -> Tree a
È sorta di possibile applicare parzialmente una tupla troppo, utilizzando (,,)
in funzione ... ma questo doesn' t sapere circa i potenziali tipi per le voci non-bound, come ad esempio:
Prelude> :t (,,) 5
(,,) 5 :: Num a => b -> c -> (a, b, c)
a meno che, immagino, si dichiara esplicitamente un tipo con ::
.
Oltre alle specialità sintattiche come questa, oltre a questo ultimo esempio del tipo scoping, esiste una differenza sostanziale tra qualunque cosa una "funzione di costruzione del valore" sia effettivamente in Haskell, rispetto a una tupla usata per memorizzare valori posizionali degli stessi tipi sono gli argomenti del costruttore del valore?
In base al punto 2, sembra che l'introduzione di un tipo di dati (al contrario di funzioni che funzionano con una convenzione di tuple) sia principalmente per la semantica che introduce per i consumatori del modulo: un modo per organizzare il pensiero e la lettura del codice. Se la performance non è grande (presumo che sia quasi sempre, data l'ubiquità della creazione di tipi di dati in Haskell), questo guadagno semantico extra vince. Ma se qualcosa è molto critico dal punto di vista delle prestazioni, o se si tratta di una parte privata di un modulo di cui pochi consumatori dovrebbero aver bisogno, allora è bene sbagliare dalla parte delle convenzioni sulla tupla? – ely
Quando dico "convenzione di tuple" intendo funzioni progettate per lavorare su una tupla che non è altrimenti chiamata o utilizzata in un tipo di dati. Lo dico in questo modo perché (e potrei essere confuso da questo) sembra che tu non possa avere un tipo di dati ricorsivo prodotto esclusivamente da 'tuple' senza usare le parole chiave' data' o 'newtype', che poi colpiscono quelle considerazioni sulla memoria, giusto? – ely
'newtype' è un concetto solo in fase di compilazione e viene cancellato durante la compilazione. A differenza di 'data', non introduce alcun sovraccarico della memoria sul tipo di wrapping. Gli aggiornamenti alla mia risposta dovrebbero spiegare il resto. –