在F#生成器中获取空值

时间:2018-12-05 13:40:41

标签: f# f#-interactive fscheck

我对此代码有疑问,我尝试生成非空字符串列表,如下所示:

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:<="; ""; ""; ""]|]

您可以看到我的代码正在生成空字符串!

请您告诉我如何解决此问题?

1 个答案:

答案 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'|]