2016-05-12 15 views
1

プロパティベースのテストコードをどのように解釈できますか?プロパティベースのテストコードをどのように解釈できますか?

私は、次のスニペットの指示に変換するために苦労しています:

let myProperty = Prop.forAll fiveAndThrees <| fun number -> 

    let actual = transform number 

    let expected = "jbdhjsdhjdsjhsdglsdjlljh" 
    expected = actual 

Check.QuickThrowOnFailure myProperty 

具体的には、私は後方のパイプライン演算子で苦労しています(すなわち「< |」)。ここで

はテストです:

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

    let myProperty = Prop.forAll fiveAndThrees <| fun number -> 

     let actual = transform number 

     let expected = "jbdhjsdhjdsjhsdglsdjlljh" 
     expected = actual 

    Check.QuickThrowOnFailure myProperty 

誰かが私はこのコードがどのように機能するかにステップバイステップで案内していただけますか?

これは、前方パイプ演算子(すなわち、 "|>")を使用して書き直すことができますか?

+3

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

+1

おかげマーク。私は、後ろ向きのパイプラインが開いた/閉じた括弧を使用する代わりの手段であることに気づいていませんでした。 –

答えて

3

この回答は|>の代わりに<|が使用される理由についてのみ説明しています。

ここには、大きな機能を持つ<|を使用するための5つの例があります。第6の例は、<|の代わりに|>を使用してコードがどのように見えるかを示すことです。要点は、|>を使用している6番目の例では、プライマリ関数funThatNeedsListAndFuncを見つけるためにコードを調べる必要がありますが、<|のプライマリ関数funThatNeedsListAndFuncは明らかです。したがって、最後のパラメータが関数の場合には、通常は<|が表示され、理解しやすいようにプライマリ関数の後に関数を渡したい場合があります。それで全部です;それ以上には読まないでください。

マークのブログを読んだ後、私は<|がを取り除くのに便利であることも知った。 ()を使用する例は、例7として与えられる。

let funThatNeedsListAndFunc list func = 
    func list 

let func = List.sum 
let list = Seq.toList { 0 .. 5} 

let result1 = funThatNeedsListAndFunc list func 

printfn "result1: %A" result1 

let result2 = funThatNeedsListAndFunc list <| func 

printfn "result2: %A" result2 

let result3 = funThatNeedsListAndFunc list <| List.sum 

printfn "result3: %A" result3 

let result4 = funThatNeedsListAndFunc list <| 
    fun (list : 'a list) -> List.sum list 

printfn "result4: %A" result4 

let result5 = funThatNeedsListAndFunc list <| 
    fun (list : 'a list) -> 
     // This will be a long function 
     let a = 1 
     let b = 2 
     let c = a * b 
     let result = List.sum list 
     let d = "more useless lines" 
     let (e,f,g) = ("a", 15, 3.0) 
     result 

printfn "result5: %A" result5 

let result6 = 
    fun (list : 'a list) -> 
     // This will be a long function 
     let a = 1 
     let b = 2 
     let c = a * b 
     let result = List.sum list 
     let d = "more useless lines" 
     let (e,f,g) = ("a", 15, 3.0) 
     result 
    |> funThatNeedsListAndFunc list 

printfn "result6: %A" result6 

let result7 = 
    funThatNeedsListAndFunc list (fun (list : 'a list) -> 
     // This will be a long function 
     let a = 1 
     let b = 2 
     let c = a * b 
     let result = List.sum list 
     let d = "more useless lines" 
     let (e,f,g) = ("a", 15, 3.0) 
     result) 

printfn "result7: %A" result7 
+0

Markがブログの記事を読んだ後、私はそれを使って書式設定を助けることができることを知っています。そのことを知らなかった。前にも触れたように、最高のF#プログラマーの何人かがHaskellを知っています。 –

+0

F#の専門知識を得る前にハスケルを学ぶことをお勧めしますか? –

+0

いいえ、前にはないが、おそらく並行している。あなたがMarkによってブログを読んだら、彼はHaskellから '<|'を使って学んだことに気が付いたことに気付くでしょう。私はまだハスケルの飛び込みを取る必要がありますが、あなたが指摘したように、私は数学的/論理的な側面に集中する傾向がありますので、型理論と高次論理でもっと働きます。 –

関連する問題