Lassen Sie uns sagen, dass ich ein Paar von Konvertierungsfunktionen habenObjektiv/Prism mit Fehlerbehandlung
string2int :: String -> Maybe Int
int2string :: Int -> String
ich diese ziemlich leicht mit Optik darstellen könnte.
stringIntPrism :: Prism String Int
Allerdings, wenn ich vertreten Versagen Grund will, würde ich brauche diese als zwei separate Funktionen zu halten.
string2int :: String -> Validation [ParseError] Int
int2string :: Int -> String`
Für dieses einfache Beispiel Maybe
ist völlig in Ordnung, da wir, dass ein Ausfall ein Parse-Ausfall immer davon ausgehen können, ist, so dass wir nicht wirklich ein Entweder oder Prüfungstyp zu codieren haben diese verwenden.
jedoch vorstellen, zusätzlich zu meinem Prism Parsen, ich möchte einige Validierung durchgeführt werden
isOver18 :: Int -> Validation [AgeError] Int
isUnder55 :: Int -> Validation [AgeError] Int
Es wäre ideal diese Dinge können compose zusammen zu sein, so dass ich konnte
ageField = isUnder55 . isOver18 . string2Int :: ValidationPrism [e] String Int
Das ist ziemlich trivial, um von Hand zu bauen, aber es scheint wie eine gemeinsame genug Konzept, dass es etwas im Bereich der Objektive/Optik lauern könnte, die dies bereits tut. Gibt es dafür eine Abstraktion?
tl; dr
Gibt es eine Standardmethode eine Teillinse/Prisma/iso der Implementierung, die über einen beliebigen Funktors parametriert werden kann, anstatt dass sie direkt an Vielleicht gebunden ?.
Ich habe die obige Haskell-Notation verwendet, weil es einfacher ist, aber ich benutze Monocle in Scala, um dies zu implementieren. Ich wäre jedoch vollkommen glücklich mit einer Antwort, die spezifisch für die Lens-Bibliothek von Ekmett ist.
Ich erinnere mich an eine reddit Diskussion über eine ähnliche Frage von vorhin. Edward Kmett [erwähnte die Idee] (https: //www.reddit.com/r/haskell/Kommentare/34igpj/hypothetical_lens_xml_parsing_that_documents/cqv346w) von "coindexed Prismen", die in der Lage sein würden, Fehlerinformationen zu melden, während sie mit normalen Objektiven kompatibel bleiben. Offensichtlich waren sie aufgrund von Typinferenzproblemen schwierig in das Linsenrahmenwerk einzupassen, so dass sie nicht implementiert wurden. – danidiaz
Ich denke, das Konzept eines Traversals wäre hier angebracht. –