我对此代码有疑问,我尝试生成非空字符串列表,如下所示:
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:<="; ""; ""; ""]|]
您可以看到我的代码正在生成空字符串!
请您告诉我如何解决此问题?
答案 0 :(得分:4)
我认为您得到的结果实际上并不包含空字符串,而是包含带有不可见字符的字符串。
要对此进行测试,可以尝试运行以下命令:
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 [] = [|'\014'|]