f# - fscheck 生成大小在 min 和 max 之间的字符串

标签 f# quickcheck fscheck

我尝试编写一个 FsCheck 生成器,它在给定的间隔内生成具有长度的字符串。

我的尝试如下:

let genString minLength maxLength = 
    let isValidLength (s : string) = 
        s.Length >= minLength && s.Length <= maxLength

    Arb.generate
    |> Gen.suchThat isValidLength
    |> Arb.fromGen

...我得到错误:
"System.Exception : No instances of class FsCheck.Arbitrary`1[a] for type System.String with arguments set []"

我究竟做错了什么?

谢谢!

更新1:

我设法像这样编写生成器:
let genStrings minLength maxLength = 
    gen {
        let! length = Gen.choose (minLength, maxLength)
        let! chars = Gen.arrayOfLength length Arb.generate<char>
        return new String(chars)
    }

有没有更好的办法?

更新 2:我想将此添加为一个单独的问题,但它与我原来的问题几乎相同。

所以我将上面的代码重构为以下结构,以便重用序列生成器:
let seqOfLength lengthInterval generator =
    gen {
        let! length = Gen.choose lengthInterval
        let! items = Gen.arrayOfLength length generator
        return items |> Seq.ofArray
    }

let sizedString lengthInterval =
    seqOfLength lengthInterval Arb.generate<char>
    |> Gen.map Strings.ofCharSeq

现在我收到运行时错误:
System.Exception : No instances of class FsCheck.Arbitrary`1[a] for type System.Char with arguments set []

...这让我回到了最初的问题:为什么它找不到 System.Char 的任意任意实例?我认为基本类型的任意性都是默认注册的。我究竟做错了什么?

谢谢!

最佳答案

您的示例代码从 FsCheck v2.14.3 开始工作

let seqOfLength lengthInterval generator =
    gen {
        let! length = Gen.choose lengthInterval
        let! items = Gen.arrayOfLength length generator
        return items |> Seq.ofArray
    }
let stringOfLength lengthInterval =
    seqOfLength lengthInterval Arb.generate<char>
    |> Gen.map String.Concat

关于f# - fscheck 生成大小在 min 和 max 之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26255550/

相关文章:

f# - Erlang 在 F# 中的并发 promise

f# - 如何为 F# 中的可区分联合覆盖 GetHashCode 和 CompareTo?

algorithm - 在 F# 中查找质数非常慢

Haskell QuickCheck 为具有许多输入变量的函数生成随机数据

c# - C# : generate a list of two dimension arrays with the same shape 中的 FsCheck

f# - 简化 F# 中的记录分配

haskell - 如何编写函数属性的快速检查?

Haskell QuickCheck2 使用 ByteString?

f# - 如何定义 FSCheck 生成器以便可以发现它

f# - 为任意长度相同的整数列表制定一个任意