首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fdef的clojure.spec验证

fdef的clojure.spec验证
EN

Stack Overflow用户
提问于 2016-09-08 03:42:29
回答 1查看 1.2K关注 0票数 6

我试图用clojure.spec1.9.0-alpha11版本编写一个更高级的函数,并且无法获得针对返回函数执行的验证。

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

代码语言:javascript
复制
(defn adder [x] #(+ x %))

如指南所述,我创建规范如下:

代码语言:javascript
复制
(s/fdef adder
  :args (s/cat :x number?)
  :ret (s/fspec :args (s/cat :y number?)
                :ret number?)
  :fn #(= (-> % :args :x) ((:ret %) 0)))

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

代码语言:javascript
复制
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)启动规范。虽然这适用于函数,但它不适用于高阶函数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-09 17:52:40

正如它在clojure 1.9-alpha14 14中所显示的那样,不能以这种方式验证高阶函数。看看clojure.spec.test/instrument,它将在spec的注册表中查找函数,其中只包含fdef'd函数。

:ret中的fspec将在通过clojure.spec.test/check测试adder时使用,并同时记录其值的函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39382252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档