Clojure 有许多用于生成测试的库,例如test.check、test.generation或data.generators。
可以使用高阶函数来创建可组合的随机数据生成器,例如:
(defn gen [create-fn content-fn lazy]
(fn [] (reduce #(create-fn %1 %2) (for [a lazy] (content-fn)))))
(def a (gen str #(rand-nth [\a \b \c]) (range 10)))
(a)
(def b (gen vector #(rand-int 10) (range 2)))
(b)
(def c (gen hash-set b (range (rand-int 10))))
(c)
这只是一个示例,可以使用不同的参数、过滤器、部分等进行修改,以创建非常灵活的数据生成函数。
是否有任何生成库可以通过组合一些高阶函数而不是(或更多)简洁地实现的东西?
作为对stackoverflow之神的旁注:我不相信这个问题是主观的。我不是在征求关于哪个图书馆更好的意见。我想知道任何/所有数据生成库的哪些特定功能或技术将它们与组合普通高阶函数区分开来。一个示例答案应该说明使用任何库生成随机数据,并解释为什么按我上面说明的方式组合 HOF 会更复杂。