gpt4 book ai didi

fdef 的 clojure.spec 验证

转载 作者:行者123 更新时间:2023-12-02 17:46:19 24 4
gpt4 key购买 nike

我正在尝试在 clojure.spec 中编写一个高阶函数使用版本 1.9.0-alpha11 并且无法针对返回的函数执行验证。

使用 clojure.spec 指南的高阶函数部分中的示例,我将adder形式定义为:

(defn adder [x] #(+ x %))

如指南中所述,我创建了一个规范:

(s/fdef adder
:args (s/cat :x number?)
:ret (s/fspec :args (s/cat :y number?)
:ret number?)
:fn #(= (-> % :args :x) ((:ret %) 0)))

当我在 repl 中执行它时,会抛出异常,而不是所需的规范验证错误:

user> (def add2 (adder 2))
#'user/add2
user> (add2 2)
4
user> (add2 "s")
ClassCastException java.lang.String cannot be cast to java.lang.Number clojure.lang.Numbers.add (Numbers.java:128)
user>

我尝试使用 (stest/instrument `adder) 打开规范。虽然这适用于函数,但不适用于高阶函数

最佳答案

就 clojure 1.9-alpha14 而言,高阶函数无法以这种方式进行验证。查看 clojure.spec.test/instrument,它正在规范的注册表中查找函数,其中仅包含 fdef 函数。

通过 clojure.spec.test/check 测试 adder 时,将使用 :ret 中的 fspec,并记录该函数是它的值(value)。

关于fdef 的 clojure.spec 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39382252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com