Warum gibt eine Prismenfunktion nicht eine Option / Vielleicht zurück?

8

In der funktionellen Optik soll ein wohlerzogenes Prisma (in scala eine Teillinse genannt) eine set Funktion vom Typ 'subpart -> 'parent -> 'parent haben, wobei, wenn das Prisma "erfolgreich ist" und ist strukturell kompatibel mit dem angegebenen Argument 'parent , dann gibt es das 'parent zurück, das mit dem entsprechenden Unterabschnitt angegeben wurde, der so geändert wurde, dass der Wert 'subpart angegeben wird. Wenn das Prisma "versagt" und strukturell mit dem Argument 'parent unvereinbar ist, gibt es das 'parent unmodifiziert zurück.
Ich frage mich, warum das Prisma nicht eine 'parent option ( Maybe für Haskellers) zurückgibt, um die Pass / Fail-Natur der Mengenfunktion darzustellen? Sollte der Programmierer nicht vom Rückgabetyp unterscheiden können, ob der Satz "erfolgreich" war oder nicht?

Ich weiß, dass es eine Menge Forschung und Überlegungen in die Bereiche der funktionellen Optik gegeben hat, also bin ich mir sicher, dass es eine definitive Antwort geben muss, die ich einfach nicht finden kann.

(Ich komme aus einem F # -Hintergrund, also entschuldige ich mich, wenn die Syntax, die ich verwendet habe, für Haskell- oder Scala-Programmierer etwas undurchsichtig ist).

    
Nathan Wilson 23.09.2017, 20:51
quelle

2 Antworten

10

Um das "Warum" zu beantworten - Linsen etc. sind ziemlich streng aus der Kategorientheorie abgeleitet, also ist das eigentlich ziemlich klar - das Verhalten, das Sie beschreiben, fällt einfach aus der Mathematik heraus, es ist nicht etwas, das jemand für irgendeinen Zweck definiert hat folgt von weit allgemeineren Ideen.

Ok, das ist nicht wirklich befriedigend.

Nicht sicher, ob die Systeme anderer Sprachen mächtig genug sind, dies auszudrücken, aber im Prinzip und in Haskell ist ein Prisma ein Spezialfall einer Traversierung . Ein Traversal ist eine Möglichkeit, alle Vorkommen von "Elementen" innerhalb eines "Containers" zu "besuchen". Das klassische Beispiel ist

%Vor%

Dies wird normalerweise wie

verwendet %Vor%

Der Fokus liegt hier auf: Sequenzieren der Aktionen / Nebeneffekte und Sammeln des Ergebnisses in einem Container mit der gleichen Struktur wie der, mit der wir angefangen haben.

Das Besondere an einem Prisma ist, dass die Container auf ein oder null Elemente beschränkt sind (), während eine allgemeine Traversierung über eine beliebige Anzahl von Elementen gehen kann). Aber der set -Operator weiß nichts darüber, weil er strikter ist. Das Schöne ist, dass Sie dies also an einer Linse oder einem Prisma oder an mapM verwenden können und immer ein vernünftiges Verhalten bekommen. Aber es ist nicht das Verhalten von "fügen Sie genau einmal in die Struktur ein oder sagen Sie mir, wenn es gescheitert ist".

Nicht, dass dies keine vernünftige Operation ist, es ist nicht das, was Objektivbibliotheken "Einstellung" nennen. Sie können es tun, indem Sie explizit zusammenpassen und neu aufbauen:

%Vor%

Genauer gesagt: Ein Prisma trennt die Fälle: ein Container kann entweder ein Element enthalten, ansonsten nichts anderes, oder er kann kein Element, aber möglicherweise etwas anderes haben.

    
leftaroundabout 23.09.2017, 22:10
quelle
12

Ich bezweifle, dass es eine definitive Antwort gibt, also gebe ich euch hier zwei.

Ursprung

Ich glaube, Prismen wurden zuerst (von Dan Doel, wenn meine vage Erinnerung richtig ist) als "Co-Linsen" vorgestellt. Während ein Objektiv von s bis a bietet

%Vor%

ein Prisma von s bis a bietet

an %Vor%

Alle Pfeile sind umgekehrt, und das Produkt (,) wird durch ein Nebenprodukt ersetzt, Either . Ein Prisma in der Kategorie der Typen und Funktionen ist also ein Objektiv der Doppelkategorie.

Für einfache Prismen scheint das s -> Either s a etwas seltsam zu sein. Warum möchtest du den ursprünglichen Wert zurück haben? Das Paket lens bietet jedoch auch typändernde Optiken. Also enden wir mit

%Vor%

Plötzlich, was wir in dem nicht übereinstimmenden Fall zurückbekommen, könnte tatsächlich ein bisschen anders sein! Um was geht es? Hier ist ein Beispiel:

%Vor%

Im zweiten (nicht übereinstimmenden) Fall ist der zurückgegebene Wert derselbe, aber sein Typ wurde geändert.

Schöne Hierarchie

Sowohl für Van Laarhoven (wie in lens ) als auch für Profunctor Style Frameworks können sowohl Linsen als auch Prismen für Traversierungen eingesetzt werden. Um das zu erreichen, müssen sie ähnliche Formen haben, und dieses Design erfüllt dies. leftaroundabouts Antwort gibt mehr Details zu diesem Aspekt.

    
dfeuer 23.09.2017 21:23
quelle