Was ist [] (Listenkonstruktor) in Haskell?
Ich Probleme Mit dem Verständnis funktoren, insbesondere, was eine konkrete Typ ist in LYAH. Ich glaube, das ist weil ich verstehe nicht, was []
wirklich ist.
fmap :: (a -> b) -> f a -> f b
- Ist
[]
einen Typ-Konstruktor? Oder ist es ein Wert-Konstruktor? - Was bedeutet es, der Art von:
[] :: [a]
? - Ist es wie
Maybe
Typ-Konstruktor, oderJust
Wert-Konstruktor?- Wenn es wie
Just
dann kommen wieJust
hat eine Signatur wieJust :: a -> Maybe a
eher alsJust :: Maybe a
in anderen Worten, warum ist nicht[]
eingegeben[] :: a -> [a]
- Wenn es wie
- LYAH sagt, es gilt für funktoren: Merken, wie wir nicht schreiben instance Functor [a], in denen aufgrund von fmap :: (a -> b) -> f -> f-b, sehen wir, dass die f hat eine Art Konstruktor, einen Typ. [a] ist bereits ein konkreter Typ (der eine Liste mit jeder Art von innen), während
[]
ist eine Art Konstruktor, der einen Typ und produzieren können Typen wie [Int], [String] oder sogar [[String]]. Ich bin verwirrt, wenn die Art der[]
bedeutet es ist wie ein literal für[a]
was ist LYAH versuchen zu bekommen?
InformationsquelleAutor der Frage Evan Carroll | 2010-02-16
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Art beschrieben wird (in eine GHCI-session):
Können wir auch darüber nachdenken, es als ob es waren definiert als:
oder
Typ-Konstruktor
[a]
ist ein polymorpher Datentyp, der kann auch geschrieben werden[] a
wie oben. Dies kann man sich in etwa vorstellen, als ob esList a
In diesem Fall
[]
ist ein Typ-Konstruktor unter einer Typ-argumenta
- und Rücksendung der Typ[] a
die darf auch geschrieben werden als[a]
.Einer schreiben kann der Typ einer Funktion wie:
Daten-Konstruktor
[]
ist ein Daten-Konstruktordie im wesentlichen bedeutet "leere Liste". Diese Daten Konstruktor nimmt keinen Wert Argumente.Gibt es eine andere Daten-Konstruktor
:
die fügt ein element an der Vorderseite von einer anderen Liste. Die Signatur dieser Daten-Konstruktor ista : [a]
- es nimmt ein element und eine andere Liste von Elementen und liefert eine resultierende Liste von Elementen.Den
[]
notation kann auch verwendet werden, als Kürzel für den Bau einer Liste. Normalerweise würden wir eine Liste erstellen als:interpretiert wird als
aber Haskell erlaubt uns auch die Verwendung der Kurzschrift
als gleichwertig im Sinn, aber etwas schöner Aussehen, notation.
Mehrdeutigen Fall
Es ist eine zweideutige Fall, das ist allgemein-gesehen:
[a]
. Je nach Kontext ist diese Schreibweise bedeuten kann entweder "eine Liste dera
's" oder "eine Liste mit genau einem element, nämlicha
." Die erste Bedeutung ist die beabsichtigte Bedeutung, wenn[a]
erscheint in einer Typwährend die zweite Bedeutung ist gemeint, wenn[a]
erscheint in einer Wert.InformationsquelleAutor der Antwort yfeldblum
Es ist (verwirrend, das gebe ich zu) syntaktisch überlastet werden sowohl ein Typ-Konstruktor und Konstruktor einen Wert.
Bedeutet es, dass (der Wert-Konstruktor)
[]
hat der Typ, der für alle Artena
ist es eine Liste vona
(die schriftliche[a]
). Dies ist, weil es eine leere Liste bei jedem Typ.Den Wert Konstruktor
[]
nicht eingegebena -> [a]
da die leere Liste hat keine Elemente, und daher müssen Sie nicht eina
um eine leere Liste vona
's. VergleichenNothing :: Maybe a
statt.LYAH redet der Typ-Konstruktor
[]
mit freundlichen* -> *
im Gegensatz zu den Wert-Konstruktor[]
mit Typ -[a]
.InformationsquelleAutor der Antwort Doug McClean
InformationsquelleAutor der Antwort Don Stewart
Nur um die Dinge expliziter, diese Daten Typ:
...hat die gleiche Struktur wie die built-in-Liste geben, aber ohne die (zwar schöner aus, aber möglicherweise verwirrend) spezielle syntax. Hier ist, was einige Korrespondenzen Aussehen:
List
=[]
Typ-Konstruktoren mit freundlichen* -> *
List a
=[a]
Typen mit Art*
Nil
=[]
- Werte, mit polymorphen TypenList a
und[a]
bzw.Cons
=:
- , Daten-Konstruktoren mit Typena -> List a -> List a
unda -> [a] -> [a]
bzw.Cons 5 Nil
=[5]
oder5:[]
single-element-Listenf Nil = ...
=f [] = ...
pattern matching leere Listenf (Cons x Nil) = ...
= f [x] = ...`, pattern-matching, single-element-Listenf (Cons x xs) = ...
=f (x:xs) = ...
pattern-matching, nicht-leere ListenIn der Tat, wenn Sie Fragen ghci über
[]
es sagt, dass Sie so ziemlich die gleiche definition:Aber Sie können nicht schreiben, wie eine definition von sich selbst, weil die Liste syntax und den "outfix" Typ-Konstruktor ist ein spezieller Fall, definiert in der Sprache, spec.
InformationsquelleAutor der Antwort C. A. McCann