gpt4 book ai didi

f# - 通过从可能性池中选择 FsCheck 生成器

转载 作者:行者123 更新时间:2023-12-04 14:57:37 24 4
gpt4 key购买 nike

有没有办法通过从每个字符串列表中只选择一个项目然后连接结果来在 FsCheck 中生成一个字符串?

我只是完全卡住了,似乎无法弄清楚。我看过 docs并在 github repo 类似的东西。我从 FSharpForFunAndProfit 完成了大部分关于 FsCheck 的阅读。 .

这就像我会想到的:

let rand = System.Random()
let randInt max = rand.Next(0, max)

let selectLetter (string: string) =
let whichLettersIndex = String.length string |> randInt
string.Substring(whichLettersIndex, 1)

let generateOddlySpelledWord listOfStrings =
List.map selectLetter listOfStrings
|> String.concat ""

let usingGenerateOddlySpelledWord =
generateOddlySpelledWord ["zZ"; "oO0Ò"; "eEê"]

这应该会生成类似“Z0ê”或“zÒE”的东西。

最佳答案

这是你想要的吗?

open FsCheck

let createGenerators (l : string seq) =
l |> Seq.map Gen.elements |> Seq.toList

type OddlySpelledWords =
static member String() =
["zZ"; "oO0Ò"; "eEê"]
|> createGenerators
|> Gen.sequence
|> Gen.map (List.map string >> String.concat "")
|> Arb.fromGen

临时测试:
open FsCheck.Xunit

[<Property(Arbitrary = [| typeof<OddlySpelledWords> |])>]
let test (s : string) =
printfn "%s" s

输出(截断):
  z0ê
ZÒe
ZOe
zoê
ZÒe
zoê
Z0e
zoê
z0ê
ZOe
zÒê
z0E
zoe

说明
createGenerators函数的类型为 seq string -> Gen<char> list ,它会创建一个 Gen从每个字符串使用 Gen.elements ,因为字符串也是 char seq ; Gen.elements创建一个 Gen将选择其中之一 char每个字符串的值。

然后它使用 Gen.sequence转换 Gen<char> listGen <char list> ,然后从那里映射。

顺便说一句,您也可以内联 createGenerators :
type OddlySpelledWords =
static member String() =
["zZ"; "oO0Ò"; "eEê"]
|> List.map Gen.elements
|> Gen.sequence
|> Gen.map (List.map string >> String.concat "")
|> Arb.fromGen

关于f# - 通过从可能性池中选择 FsCheck 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28797812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com