2017-01-12 1 views
4

ich die chessie Bibliothek von Hilfsfunktionen bin mit ROP zu tun (entweder Monade) https://github.com/fsprojects/Chessie/blob/master/src/Chessie/ErrorHandling.fsF # entweder Monade (ROP) zu komponieren Funktion mit zwei Parametern

aber ich bin nicht sicher, wie kurz die folgenden zusammen drei Funktionen zusammen. Wobei twoInputFunc nur ausgewertet werden sollte, wenn func1 und func2 erfolgreich sind.

val func1 : int -> Result<Tp1, 'a> 
val func2 : string -> Result<Tp2, 'a> 
val twoInputFunc : par1:Tp1 -> Tpar2:Tp2 -> Result<Ta,'a> 
+1

Ich denke, Chessie schön für Dinge wie Eingabe arbeitet Handhabung, wo man wirklich durch eine Folge gehen müssen Operationen Parsing. Allerdings macht es Ihren Code hässliches, wenn Sie es für zu viele Dinge verwenden - es gibt eine heikle Balance, aber manchmal gewöhnliche Ausnahmen verwenden könnten nur einfacher sein (wie Sie genau diese Art der Sache zu vermeiden). Es ist schwer ohne ein konkretes Beispiel zu sagen, aber es ist gut, nicht zu religiös zu sein :-). –

Antwort

9

Ich denke, das sollte funktionieren:

let f x y = trial { 
    let! a = func1 x 
    let! b = func2 y 
    return! twoInputFunc a b} 

Die Idee ist, dass Sie jedes Ergebnis zu a und b und dann binden, werden als Input für den letzten Funktionsaufruf verwendet. Wenn entweder func1 oder func2 zu einem Fehler führt, wird der Fehler kurzgeschlossen und der Fehler zurückgegeben.

Eine weitere Möglichkeit, mit applicatives ist:

let g x y = flatten (twoInputFunc <!> func1 x <*> func2 y) 

Hier gelten Sie beiden Argumente in einem Applicative Stil, aber dann werden Sie mit einem Ergebnis von Ergebnis Ende-up, so dass Sie es glätten müssen, ist dies gleichbedeutend mit dem Monad join Betrieb.

Haftungsausschluss: Ich habe nicht Chessie installiert haben, so dass ich den obigen Code nicht versucht, aber ich versuchte, mit FSharpPlus, die für alle Monaden generisch ist (nicht nur Entweder) und es funktioniert gut (monad statt trial mit und join anstelle von flatten).

+0

Danke das hat funktioniert. Ich überprüfe F # +. Ist es möglich, dass Sie mir das gleiche mit der Infix-Operator-Syntax zeigen können? nur bearbeiten sah, dass Sie das auch zugegeben. – Chinwobble

+0

Ah, du meinst den Applicative, ja ich habe es einfach hinzugefügt. – Gustavo

+0

Danke für die Hilfe. Können Sie mir irgendwelche Open-Source-Projekte vorschlagen, die ich betrachten kann, um diese Konzepte auf idiomatische Weise zu sehen? Ich konnte meist nur einfache konstruierte Beispiele und Funktionsbibliotheks-Projekte sehen. – Chinwobble

Verwandte Themen