Hinweis für andere potenzielle Mitwirkende: Bitte zögern Sie nicht, abstrakte oder mathematische Notationen zu verwenden, um Ihren Standpunkt zu verdeutlichen. Wenn ich Ihre Antwort unklar finde, werde ich um Aufklärung bitten, aber ansonsten können Sie sich auf bequeme Weise ausdrücken.
Um es klar auszudrücken: Ich suche weder einen "Tresor" head
, noch ist die Wahl von head
besonders außergewöhnlich aussagekräftig. Das Fleisch der Frage folgt der Diskussion von head
und head'
, die dazu dienen, Kontext zu liefern.
Ich habe mich jetzt seit ein paar Monaten mit Haskell abgehackt (bis zu dem Punkt, dass es meine Hauptsprache geworden ist), aber ich bin zugegebenermaßen nicht gut über einige der fortgeschritteneren Konzepte oder die Details der Sprachphilosophie informiert (obwohl) Ich bin mehr als bereit zu lernen. Meine Frage ist dann weniger eine technische (es sei denn, es ist und ich merke es einfach nicht), sondern eine der Philosophie.
Für dieses Beispiel spreche ich head
.
Wie ich mir vorstellen kann, werden Sie wissen,
Prelude> head []
*** Exception: Prelude.head: empty list
Dies folgt aus head :: [a] -> a
. Meinetwegen. Offensichtlich kann man kein Element von (handgewellt) keinem Typ zurückgeben. Gleichzeitig ist es einfach (wenn nicht trivial) zu definieren
head' :: [a] -> Maybe a
head' [] = Nothing
head' (x:xs) = Just x
Ich habe hier im Kommentarbereich bestimmter Aussagen eine kleine Diskussion darüber gesehen . Bemerkenswert ist ein Alex Stangl
"Es gibt gute Gründe, nicht alles" sicher "zu machen und Ausnahmen zu werfen, wenn die Voraussetzungen verletzt werden."
Ich stelle diese Behauptung nicht unbedingt in Frage, bin aber gespannt, was diese "guten Gründe" sind.
Zusätzlich sagt ein Paul Johnson:
'Zum Beispiel könnten Sie "safeHead :: [a] -> Vielleicht a" definieren, aber anstatt entweder eine leere Liste zu behandeln oder zu beweisen, dass dies nicht möglich ist, müssen Sie "nichts" behandeln oder beweisen, dass dies nicht möglich ist . '
Der Ton, den ich aus diesem Kommentar lese, deutet darauf hin, dass dies eine bemerkenswerte Zunahme von Schwierigkeit / Komplexität / etwas ist, aber ich bin nicht sicher, ob ich verstehe, was er da rausbringt.
Ein Steven Pruzina sagt (2011 nicht weniger),
"Es gibt einen tieferen Grund, warum z. B. 'head' nicht absturzsicher sein kann. Um polymorph zu sein und dennoch eine leere Liste zu verarbeiten, muss 'head' immer eine Variable des Typs zurückgeben, die in einer bestimmten leeren Liste nicht vorhanden ist Delphic, wenn Haskell das könnte ... ".
Geht der Polymorphismus verloren, wenn die Behandlung leerer Listen zugelassen wird? Wenn ja, wie und warum? Gibt es bestimmte Fälle, die dies offensichtlich machen würden? Dieser Abschnitt wurde von @Russell O'Connor ausführlich beantwortet. Alle weiteren Gedanken sind natürlich willkommen.
Ich werde dies bearbeiten, wie es die Klarheit und der Vorschlag vorschreiben. Alle Gedanken, Papiere usw., die Sie zur Verfügung stellen können, werden am meisten geschätzt.