2

私はF#が初めてで、int値を次から抽出する方法がわかりません:

let autoInc = FsCheck.Gen.choose(1,999)

コンパイラは型がGen<int>であると言いますが、そこから int を取得できません!. 10 進数に変換する必要がありますが、両方の型に互換性がありません。

4

3 に答える 3

3

消費者の観点からは、Gen.sampleコンビネータを使用できます。コンビネータは、ジェネレータ (例: Gen.choose) を指定すると、いくつかのサンプル値を返します。

の署名Gen.sampleは次のとおりです。

val sample : size:int -> n:int -> gn:Gen<'a> -> 'a list

(* `size` is the size of generated test data
   `n`    is the number of samples to be returned
   `gn`   is the generator (e.g. `Gen.choose` in this case) *)

sizeその分布は一様であるため、無視するため、無視できGen.chooseます。次のようにします。

let result = Gen.choose(1,999) |> Gen.sample 0 1 |> Seq.exactlyOne |> decimal

(* 0 is the `size` (gets ignored by Gen.choose)
   1 is the number of samples to be returned *)

result閉区間[1, 999]内の値である必要があります(例: 897 ) 。

于 2015-04-17T04:43:25.663 に答える
2

こんにちは、Nikos がすでにあなたに言ったことに追加します。これは、1 から 999 までの 10 進数を取得する方法です。

#r "FsCheck.dll"

open FsCheck

let decimalBetween1and999 : Gen<decimal> =
    Arb.generate |> Gen.suchThat (fun d -> d >= 1.0m && d <= 999.0m)

let sample () = 
    decimalBetween1and999
    |> Gen.sample 0 1 
    |> List.head 

sample ()ランダムな小数を取得するために使用できるようになりました。

1 から 999 までの整数だけが必要だが、それらを次のように変換するdecimal場合:

let decimalIntBetween1and999 : Gen<decimal> =
    Gen.choose (1,999)
    |> Gen.map decimal

let sampleInt () = 
    decimalIntBetween1and999
    |> Gen.sample 0 1 
    |> List.head 

代わりにおそらく本当にやりたいこと

これを使用して、いくつかの適切な型を作成し、次のようなプロパティを確認します (ここでは、Xunit をテスト フレームワークとして使用し、FsCheck.Xunit パッケージを使用します。

open FsCheck
open FsCheck.Xunit

type DecTo999 = DecTo999 of decimal

type Generators = 
    static member DecTo999 =
        { new Arbitrary<DecTo999>() with
            override __.Generator = 
                Arb.generate 
                |> Gen.suchThat (fun d -> d >= 1.0m && d <= 999.0m)
                |> Gen.map DecTo999
        }

[<Arbitrary(typeof<Generators>)>]
module Tests =

  type Marker = class end

  [<Property>]
  let ``example property`` (DecTo999 d) =
    d > 1.0m
于 2015-04-17T04:52:43.137 に答える