在 F# 生成器中获取空值

Getting empty value in F# generator

我对这段代码有疑问,我试过像这样生成非空字符串列表:

let! x = Arb.generate<string> |> Gen.filter(fun (x) -> x<>null && x <>""&& x<>" ")|>Gen.nonEmptyListOf 

在 运行 我的代码之后我得到了这个输出:

val it : string list [] =
  [|["""; ")"; ":}E"; "B"; "!"; "v"; "re"; "Dv-"; ""; "";
     "eALyb|>Jn %;a="v`m:<="; ""; ""; ""]|]

如您所见,我的代码正在生成空字符串!

你能告诉我如何解决这个问题吗?

我认为你得到的结果实际上并不包含一个空字符串,而是包含一个带有不可见字符的字符串。

要对此进行测试,您可以尝试 运行 以下操作:

let gen = 
  Arb.generate<string> 
  |> Gen.filter(fun (x) -> x<>null && x <>""&& x<>" ")|>Gen.nonEmptyListOf 
let res = Gen.eval 1000 (Random.mkStdGen(42L)) gen

使用 42 作为我的种子,我在偏移量 80 处得到一个字符串值,呈现为 "",但它实际上是一个不可见的字符。这是 F# 交互会话:

> res.[80];;
val it : string = ""

> res.[80].ToCharArray();;
val it : char [] = [|'4'|]