Генератор функций в test.check

Я хочу сделать генераторы для функций.

Я заметил, что действительно есть генераторы для IFn значения, но когда область функции бесконечна (и так как значения строгие), их не очень удобно использовать в качестве генераторов для функций.

Существует ли эта функциональность или я должен был бы реализовать ее сам?

2 ответа

Решение

Я думаю, что ответ зависит от того, какое поведение вы ожидаете от функции. В общем, вы можете использовать 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)))
Другие вопросы по тегам