2016-03-25 7 views
1

Ich brauche Hilfe zu verstehen, wie "< |" der folgende Code verhält sich für:Wie funktioniert die Rückwärts-Pipeline (d. H. "<|") Wirklich?

Prop.forAll fiveAndThrees <| fun number -> 

    let actual = transform number 

    let expected = "FizzBuzz" 
    expected = actual 

Die Dokumentation sagt der folgende:

leitet das Ergebnis des Ausdrucks auf der rechten Seite auf die Funktion auf der linken Seite (Rückwärts-Rohrführung).

fiveAndThrees ist keine Funktion, sondern ein Wert, und es ist auf der linken Seite des Operators.

interpretiere ich die obige Definition als:

eine Eingabe aufgerufenen Funktion Take „Nummer“ und ihn in die „transformieren“. Wenn wir jedoch das Ergebnis des Ausdrucks auf der rechten Seite an die Funktion auf der linken Seite übergeben, dann wann und wie wird die Eingabe (d. H. Nummer) tatsächlich initialisiert?

Ich sehe es einfach nicht.

Der vollständige Test ist folgende:

[<Fact>] 
let ``FizzBuzz.transform returns FizzBuzz``() = 
    let fiveAndThrees = Arb.generate<int> |> Gen.map ((*) (3 * 5)) 
              |> Arb.fromGen 

    Prop.forAll fiveAndThrees <| fun number -> 

     let actual = transform number 

     let expected = "FizzBuzz" 
     expected = actual 

Die Funktion getestet werden, ist die folgende:

let transform number = 
    match number % 3, number % 5 with 
    | 0, 0 -> "FizzBuzz" 
    | _, 0 -> "Buzz" 
    | 0, _ -> "Fizz" 
    | _ -> number.ToString() 
+1

Siehe http://blog.ploeh.dk/2016/03/01/ad-hoc-arbitraries-now-with-pipes –

Antwort

4

<| ist ein Operator, der weniger dicht als Funktion Anwendung bindet, so

Prop.forAll fiveAndThrees <| fun number -> ... 

wird als

geparst
(Prop.forAll fiveAndThrees) <| fun number -> ... 

Prop.forAll hat zwei Parameter, eine Arbitrary<T> und eine Funktion T -> TestableProp.forAll fiveAndThrees so ist eine Funktion, auf die die rechte Seite übergeben wird.

+0

Danke Lee. Wenn jedoch die rechte Seite (d. H. Ausdruck) zuerst ausgeführt wird, wie wird dann die Eingabe (d. H. Nummer) des Ausdrucks initialisiert? –

+3

@ScottNimrod - Der Ausdruck auf der rechten Seite ist zufällig eine Funktion, also ist es genauso wie 'Prop.forAll fiveAndThrees (Spaß Nummer -> ..)'. Ich nehme an, die Verwendung von '<|' ist nur eine stilistische Wahl. – Lee

+0

Richtig, meine häufigste Verwendung des Operators '<|' ist, wenn ich das Zeug nicht in extra Parens rechts einpacken will. Wie zum Beispiel 'raise <| CustomException (msg) 'vs' raise (CustomException (msg)) '. In diesem Fall gab es einen mehrzeiligen Lambda-Ausdruck, der in Parens etwas unhandlich ist. –

Verwandte Themen