範囲内で double を生成する関数があります。
let gen_doublein =
fun mx mn -> Arb.generate<float> |> Gen.suchThat ( (>) mx ) |> Gen.suchThat ( (<) mn )
次に、これらのうちの 2 つの配列を生成する関数:
let gen_params:Gen<double array> =
gen { let! x = gen_doublein 0.0 20000.0
let! y = gen_doublein 0.0 2000.0
return [| x;y|] }
置いた:
static member arb_params = Arb.fromGen gen_params
Generator クラスに追加して登録します。すべて問題ないようです。これがすべて問題ないことをテストするには、次のようにします。
let f2 (xs:double array) :double= exp (-2.0*xs.[0]) + xs.[1]*exp (-2.0*xs.[0])
let fcheck fn xs = fn xs > 0.0
次に、配列ジェネレーター「arrayOfLength」を使用します。
Check.Quick (Prop.forAll (arrayOfLength 2) (fcheck f2))
ただし、期待どおりに動作します。
Check.Quick (Prop.forAll (Generators.arb_params) (fcheck f2))
計算を開始しただけで、戻ってきません。f# の達人、助けてください。