私はF#が初めてで、int値を次から抽出する方法がわかりません:
let autoInc = FsCheck.Gen.choose(1,999)
コンパイラは型がGen<int>
であると言いますが、そこから int を取得できません!. 10 進数に変換する必要がありますが、両方の型に互換性がありません。
消費者の観点からは、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 ) 。
こんにちは、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