test.check 中的函数发生器
Function generator in test.check
我想制作一个函数生成器。
我注意到确实有 IFn
值的生成器,但是当函数域是无限的(并且由于值是严格的)时,将它们用作生成器通常不切实际函数。
是否存在此功能,还是我必须自己实现?
我认为答案取决于您期望函数具有什么样的行为。通常,您可以使用 gen/let
或 gen/fmap
根据生成的值创建任意函数。例如,您可以生成一个值列表并使用它来构造一个函数,该函数根据输入的 hash
从列表中选择一些东西:
(gen/let [rets (gen/not-empty (gen/vector gen/any))]
(fn [x]
(rets (mod (hash x) (count rets)))))
在 gfredericks 的基础上构建更完整的解决方案:
(defn fn-gen
([result-gen results-n result-scale]
(gen/fmap
(fn [results] (fn [& args] (get results (mod (apply + (map hash args)) results-n))))
(gen/vector (gen/scale (partial + result-scale) result-gen) results-n)))
([result-gen result-n] (fn-gen result-gen result-n 10))
([result-gen] (fn-gen result-gen 10)))
我想制作一个函数生成器。
我注意到确实有 IFn
值的生成器,但是当函数域是无限的(并且由于值是严格的)时,将它们用作生成器通常不切实际函数。
是否存在此功能,还是我必须自己实现?
我认为答案取决于您期望函数具有什么样的行为。通常,您可以使用 gen/let
或 gen/fmap
根据生成的值创建任意函数。例如,您可以生成一个值列表并使用它来构造一个函数,该函数根据输入的 hash
从列表中选择一些东西:
(gen/let [rets (gen/not-empty (gen/vector gen/any))]
(fn [x]
(rets (mod (hash x) (count rets)))))
在 gfredericks 的基础上构建更完整的解决方案:
(defn fn-gen
([result-gen results-n result-scale]
(gen/fmap
(fn [results] (fn [& args] (get results (mod (apply + (map hash args)) results-n))))
(gen/vector (gen/scale (partial + result-scale) result-gen) results-n)))
([result-gen result-n] (fn-gen result-gen result-n 10))
([result-gen] (fn-gen result-gen 10)))