【发布时间】:2018-10-23 05:48:52
【问题描述】:
在 C# 中使用 FsCheck,我需要生成一个值列表,其中某些值可能不会彼此相邻。这是词法分析器的标记列表。例如,我不需要生成两个相邻的标识符,或者一个关键字旁边的标识符,因为当它们变成字符串时,词法分析器会将它们视为一个标记。我不能简单地做这样的事情:
Gen.ListOf(Gen.Elements("fizz", "buzz", "bazz", "+", " ", "if")).Where(list => ...);
在一个合理长度的列表中,很可能有两个不应该相邻的标记。因此过滤器会丢弃太多的值,生成会很慢。我考虑过添加或删除标记来尝试修复列表,但这似乎非常复杂,我担心它会生成太短或太长的列表。
我想要做的是“一次一个元素”生成列表。所以我会随机选择长度,然后随机选择每个元素是否允许跟随前面的元素,直到我有完整的列表。这似乎应该是递归可行的,但我不知道如何用生成器组合器来表达它。有没有办法做到这一点?我希望我可以编写一个任意的 lambda,它可以直接调用其中的生成器,而不需要编写它们。有这样的可能吗?
注意:我已经简化了这个例子。令牌生成要复杂得多。
【问题讨论】:
-
生成合法元组,然后将元组扁平化为字符串序列是否有意义?