Sono un nuovo arrivato ad Haskell e sto attualmente passando per Real World Haskell. Il libro dice che il costruttore del tipo è usato solo nella firma del tipo mentre il costruttore del valore è usato nel codice reale. Fornisce anche un esempio di una dichiarazione per mostrare che i nomi di entrambi sono indipendenti l'uno dall'altro. Perché sono necessari due costruttori in primo luogo, se solo uno di essi è utilizzato nel codice reale? Dal momento che non useremmo il costruttore di tipi nel codice reale, a che scopo serve il costruttore del tipo?Perché esiste un costruttore di valori oltre al costruttore di tipi in Haskell?
risposta
Forse i nomi sono un po 'fuorvianti. Un costruttore di tipo rappresenta il nome del tipo che stai dichiarando. Si chiamano così perché costruiscono tipi, non valori: infatti, essendo (possibilmente) parametrizzati su variabili di tipo definiscono una famiglia di tipi. Agiscono come i modelli di C++ e i generici di Java. In data MyType a b = Constr a b
, MyType è un tipo di costruttore che accetta due tipi a
e b
per creare un nuovo tipo (MyType a b)
.
A Il costruttore di valore è l'unica parte che si chiama "costruttore" in altre lingue (orientate agli oggetti), poiché è necessaria per creare valori per quel tipo. Pertanto, nell'esempio precedente, se si assume il valore Constr :: a -> b -> MyType a b
, è possibile creare un valore Constr "abc" 'd' :: MyType [Char] Char
.
Posso chiedere come migliorare la mia risposta per sbarazzarmi di quel -1? Cosa c'è che non va? –
Un modo conveniente per ottenere l'intuizione tipi e valori è che i primi sono fase di compilazione valori, mentre i secondi sono runtime valori. In altre parole, i costruttori di tipo sono costruttori di valori nel set di Haskell Types, al solo scopo di digitare il programma in fase di compilazione. Ciò significa anche che non è possibile costruire un tipo in fase di esecuzione e non è possibile creare un valore in fase di compilazione.
Quindi, poiché non è possibile diramare esplicitamente in fase di esecuzione sulla base di un valore di tipo (sebbene sia possibile implicitamente con le classi di caratteri), i costruttori di tipo sono totalmente inutili come oggetti di runtime e in molti casi sono totalmente assenti l'ultimo binario. Viceversa, poiché i costruttori di valori consentono di costruire valori nell'insieme del loro tipo in fase di esecuzione, sono totalmente inutili come oggetto in fase di compilazione.
A causa di questa semplice proprietà, i costruttori di tipo ei costruttori di valori possono condividere nomi in modo univoco.
Questa è la risposta più semplice da capire per le persone che provengono da uno sfondo imperativo! –
È un po 'come dire "perché abbiamo bisogno di classi e oggetti se gli oggetti sono l'unica cosa che viene effettivamente eseguita?"
I due tipi di costruttori svolgono diversi lavori. I costruttori di tipo vanno in firme di tipo. I costruttori di valore vanno in codice eseguibile.
Nel caso più semplice, un tipo "costruttore" è solo un nome di tipo. Nel caso più semplice, un tipo ha solo un costruttore di valori. Così si finisce con le cose come
data Point = Point Int Int
Si potrebbe dire a te stesso "ora perché diamine a Ho bisogno di scrivere Point
due volte?"
Ma ora consideriamo un esempio meno banale:
data Tree x = Leaf x | Branch (Tree x) (Tree x)
Qui Tree
è un costruttore di tipo.Gli dai un argomento di tipo e "costruisce" un tipo. Quindi Tree Int
è un tipo, Tree String
è un altro tipo e così via. (Come modelli in C++, o generici in Java o Eiffel.)
D'altra parte, Leaf
è un costruttore di valori. Dato un valore, ne fa un albero a 1 nodo. Quindi Leaf 5
è un valore Tree Int
, Leaf "banana"
è un valore Tree String
e così via.
Analogamente per Branch
. Prende due valori dell'albero e costruisce un nodo dell'albero con quegli alberi come bambini. Ad esempio, Branch (Leaf 2) (Leaf 7)
è un valore Tree Int
.
Grazie per la spiegazione dettagliata! –
- 1. Esiste un costruttore di const?
- 2. Non nell'ambito: costruttore di dati in Haskell
- 3. Perché non esiste un costruttore di riserva per std :: string?
- 4. Come gestire valori errati in un costruttore?
- 5. C#: tipi generici con un costruttore?
- 6. Aggiunta al "costruttore" di un modello django
- 7. In Haskell, come si restringono le funzioni a un solo costruttore di un tipo di dati?
- 8. Costruttore dati nel modello haskell
- 9. Perché non c'è nessuna chiamata al costruttore?
- 10. java: perché non dovrebbe essere permesso di sfuggire al costruttore?
- 11. Perché un costruttore di classe base privato risulta in "Costruttore super implicito non visibile"
- 12. Esiste un costruttore generico con limitazione di parametro in C#?
- 13. C++ chiamata al costruttore un altro costruttore in base a parametri di tipo
- 14. Perché chiamare super() in un costruttore?
- 15. Esiste un uso legittimo per il costruttore di oggetti?
- 16. Convenzione in java - "nuovo" al di fuori del costruttore/metodo?
- 17. defaultdict con un parametro al costruttore di classe
- 18. Costruttore Variadic di fallback - perché funziona?
- 19. "chiamata al costruttore deve essere la prima istruzione in un costruttore" questione in Java
- 20. Chiamata al costruttore della classe figlio prima del costruttore genitore
- 21. Quali valori può restituire un costruttore per evitare di restituirlo?
- 22. costruttore o copia costruttore?
- 23. Argomenti costruttore costruttore ES6
- 24. * effettua una chiamata al costruttore?
- 25. quando utilizzare i valori predefiniti rispetto al costruttore di inizializzazione su un modello
- 26. Costruttore Java che utilizza tipi generici
- 27. Perché il costruttore di java.io.FileDescriptor è pubblico?
- 28. Esiste un'enciclopedia/elenco di classi di tipi comuni in Haskell?
- 29. Perché PHP non ha un costruttore predefinito?
- 30. Nasconditore costruttore
La frase "codice effettivo" è sfortunata, perché implica che non si userebbe il costruttore di tipi nei programmi, quando gli autori in realtà intendevano che i costruttori di tipo sono usati solo per le annotazioni di tipo. Questo equivale a dire che non hai bisogno delle parole chiave "int" o "long" in C perché non le usi nel codice reale (vengono utilizzate solo nelle dichiarazioni, che non contano come "codice effettivo" "con questo standard). –
... no accetta? :) –