/ / Warum verwendet Haskell in Teilfunktionen Bottom anstelle von NULL? - Haskell, Typen

Warum verwendet Haskell in partiellen Funktionen bottom statt null? - Haskell, Typen

Ich lese über Haskells Denotationssemantik (http://en.wikibooks.org/wiki/Haskell/Denotational_semantics) und ich verstehe nicht, warum in einem Typ der untere "Wert" auf einer anderen Ebene liegt als "normale" Werte, z. B. warum er nicht patentgetreu sein kann.

Ich glaube, dass das Patchen unten patchen würdeProbleme verursachen, da unten auch nicht-terminierende Berechnungen angezeigt werden, aber warum sollten nicht terminierende Berechnungen und Fehler gleich behandelt werden? (Ich gehe davon aus, dass das Aufrufen einer Teilfunktion mit einem nicht unterstützten Argument als Fehler betrachtet werden kann).

Welche nützlichen Eigenschaften würden verloren gehen, wenn alle Haskell-Typen einen Muster-kompatiblen Java-Null-ähnlichen Wert anstelle von Bottom enthalten würden?

Mit anderen Worten: Warum sollte es nicht klug sein, alle Haskell-Funktionen durch das Anheben aller Typen mit Nullwert vollständig zu machen?

(Benötigen nicht terminierende Berechnungen überhaupt einen speziellen Typ?)

Antworten:

17 für die Antwort № 1

Sie können die Nichtbeendigung nicht beenden, ohne die Vollständigkeit Ihrer Sprache einzuschränken, und durch das Anhalten-Problem können wir im Allgemeinen keine Nichtbeendigung feststellen und sie durch einen Wert ersetzen.

Damit jeden Die vollständige Sprache hat den Tiefpunkt.

Der einzige Unterschied zwischen Haskell und Java ist dann, dass Java den Boden hat und Null. Haskell hat das letztere nicht, was praktisch ist, denn dann müssen wir nicht nach Nullen suchen!

Anders ausgedrückt, da unten ist unausweichlich (in der turing complete world), worauf kommt es dann an ebenfalls alles Nulbling machen, außer Bugs?

Beachten Sie auch, dass, während einige Funktionen im Prelude aus historischen Gründen teilweise unvollständig sind, der moderne Haskell-Stil dazu neigt, Totalfunktionen fast überall zu schreiben und ein Explizites zu verwenden Maybe Rückgabetyp in Funktionen wie head das wäre sonst teilweise.


14 für die Antwort № 2

Meine Kritik in den Kommentaren nicht zu widerstehen, ich denke sclv beantwortet den ersten Teil Ihrer Frage, aber zu

Welche nützlichen Eigenschaften würden verloren gehen, wenn alle Haskell-Typen einen Muster-kompatiblen Java-Null-ähnlichen Wert anstelle von Bottom enthalten würden?

Mit anderen Worten: Warum sollte es nicht klug sein, alle Haskell-Funktionen durch das Anheben aller Typen mit Nullwert vollständig zu machen?

Hier scheinen Sie einen Unterschied zu machenzwischen Nicht-Kündigung und Ausnahme. Also, obwohl es unmöglich ist (wegen des Problems mit dem Anhalten), bei Nicht-Beendigung eine Musterübereinstimmung zu erhalten, warum ist es nicht möglich, eine Übereinstimmung bei einer Ausnahme zu pattern?

Darauf antworte ich mit einer eigenen Frage: Was ist mit Funktionen, die niemals eine Ausnahme auslösen? Haskell hat schließlich alle Funktionen. Ich sollte nicht Mustervergleiche durchführen müssen, um sicherzustellen, dass etwas nicht außergewöhnlich ist, wenn es als nicht-außergewöhnlich bekannt ist. Haskell, als Bondage- und Disziplinsprache, würde diesen Unterschied natürlich in den Typen kommunizieren wollen. Vielleicht schriftlich

Integer

für die Art von Ganzzahlen, von denen bekannt ist, dass sie nicht außergewöhnlich sind und

?Integer

für den Typ von Ganzzahlen, die stattdessen eine Ausnahme sein könnten. Die Antwort ist, dass wir das schon machen: Haskell hat einen Typ im Vorspiel

data Maybe a = Just a | Nothing

was kann als "entweder ein a oder gar nichts. "Wir können das Muster anpassen Maybe Dieser Vorschlag gibt uns also nichts. (Wir haben auch Typen wie Either für reichere Arten von "Berechnungen, die schiefgehen könnten" sowie für fancy monad syntax / combinators, damit diese einfach zu bedienen sind.

Also, warum? Ausnahmen überhaupt? In Haskell können wir Ausnahmen außer in der IO-Monade nicht "fangen". Wenn wir Exceptions perfekt mit simulieren können Maybe und Either Warum gibt es Ausnahmen in der Sprache?

Es gibt ein paar Antworten darauf, aber der Kern ist das Haskell-Ausnahmen sind ungenau. Eine Ausnahme könnte aufgrund Ihres Programms auftretenIhnen wurde kein Speicher mehr zur Verfügung gestellt, oder der Thread, den Sie ausgeführt haben, wurde von einem anderen Thread oder einer ganzen Reihe anderer nicht vorhersehbarer Gründe getötet. Außerdem, im Allgemeinen mit Ausnahmen kümmern wir uns welche Ausnahme, wir gehen raus. Also, was sollte der folgende Ausdruck ergeben?

(error "error 1") + (error "error 2") :: Integer

Dieser Ausdruck sollte eindeutig zu einer Ausnahme führen, aber zu welcher Ausnahme? (+) auf Integer spezialisiert ist, ist in beiden Argumenten streng, so dass das nicht helfen wird. Wir könnten einfach entscheiden, dass es der erste Wert ist, aber dann hätten wir im Allgemeinen

x + y =/= y + x

das würde unsere Optionen für gleichwertige einschränkenArgumentation. Haskell gibt eine Vorstellung von Ausnahmen mit ungenauem Verhalten, und dies ist wichtig, da der reine Teil der Sprache ein perfekt präzises Verhalten hat und das einschränkend sein kann.