2016-03-25 11 views
8

Ich weiß, dass es die Back-Pipe (<|)-Operator, in mehreren anderen SO-Antworten verwiesen. Aber das funktioniert nicht gut, wenn es mit den Vorwärtsleitungen (|>) kombiniert wird, die in der Verkettung üblich sind. Ich suche jedoch nach verwandten Optionen. Gibt es eine eingebaute Version der folgenden Funktionsdefinition? Oder ist das eine schlechte/gefährliche Übung?

let inline (^%) f = f 

let stuff = 
    [1;2;3] 
    |> Seq.filter ^% (>) 2 
    |> Seq.map ^% fun x -> x.ToString() 


// compare to this, which doesn't compile (and would be hard to follow even if it did) 
let stuff = 
    [1;2;3] 
    |> Seq.filter <| (>) 2 
    |> Seq.map <| fun x -> x.ToString() 
+0

Mögliches Duplikat von [Funktion Anwendungsoperator ($) in F #?] (Http://stackoverflow.com/questions/7183903/function-application-operator-in-f) –

+0

Nein. http://Stackoverflow.com/q/7183903/3909293 –

+0

Ich habe nicht genug Wissen über Haskell zu beantworten, aber werfen Sie einen Blick auf [FsControl] (https://github.com/gmpl/FsControl) und suchen Sie Antworten von [Gustavo] (http://stackoverflow.com/users/446822/gustavo?tab=answers) –

Antwort

8

Es gibt einige Haskell Features wie optionale infixing mit Backticks und Abschnitte, die in F # nicht verfügbar sind. Das macht bestimmte Konstrukte etwas ausführlicher.

Normalerweise würde ich einfach ein Rohr von Funktionen wie die oben wie folgt schreiben:

let stuff = 
    [1;2;3] 
    |> Seq.filter (fun x -> x < 2) 
    |> Seq.map string 

Das ist, meiner Meinung nach, viel besser lesbar. Zum Beispiel mit Seq.filter ^% (>) 2, würde ich intuitiv lesen, dass ‚alle Werte größer als 2‘ dahin, aber das ist nicht das, was sie tut:

> let inline (^%) f = f;; 

val inline (^%) : f:'a -> 'a 

> let stuff = 
    [1;2;3] 
    |> Seq.filter ^% (>) 2 
    |> Seq.map ^% fun x -> x.ToString() 
    |> Seq.toList;; 

val stuff : string list = ["1"] 

Wenn Sie den Leser des Codes in Zweifel, was verlassen der Code tut, du hast gerade alle weniger produktiv gemacht. Die Verwendung von Seq.filter (fun x -> x < 2) kann ausführlicher aussehen, ist aber für den Leser eindeutig.

+0

Ironischerweise hatte ich es ursprünglich als' 'geschrieben fun x -> x <2' wenn du das Beispiel tippst und dann dachtest "nah, jemand wird darauf hinweisen, wie man es kürzen kann". –

+0

Irgendwelche Gedanken zu '^%' vs '<|' in Bezug auf http://blog.ploeh.dk/2016/03/01/ad-hoc-arbitraries-now-with-pipes/? Ich schätze, dass sie in diesem Fall dasselbe tun, also genauso gut bei der eingebauten Op bleiben können. Obwohl '^%' helfen würde, wenn es in einer '|>' Kette wäre. –

+0

dh du könntest 'Gen.elemente [4..8] |> Arb.fromGen |> Prop.forAll ^% Spaß neighborCount -> ...' –

Verwandte Themen