2024 Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面以获取更多关于如何使用本页面的信息。

0
Spec

如何最简单地对这个函数进行规范?特别是:fn部分

(s/def ::edges #{0.149 0.150 0.050})
(s/def ::result #{:correct :incorrect})

(s/fdef foo
        :args (s/cat :student-response ::edges :authoritative-answer ::edges)
        :ret ::result
:fn ? )

基本上,如果四舍五入到十分位的student-response与四舍五入到十分位的authoritative-answer匹配,则函数返回:correct;否则返回:incorrect

我选择了触及四舍五入边界值的边缘,而不是寄希望于数字生成过程会偶然遇到这些边缘。

2 个答案

0
 
最佳答案

好的。以下是我使用的内容,并且它有效。有更简单的办法吗?

(defn- round [some-number to]
  (double (/ (Math/round (double (* (/ 1 to) some-number))) (/ 1 to))))

(s/def ::edges #{0.149 0.150 0.050})
(s/def ::result #{:correct :incorrect})

(s/fdef foo
        :args (s/cat :student-value ::edges :authoritative-value ::edges)
        :ret ::result
        :fn (s/or
              :correct-answer (s/and #(= (round (-> % :args :student-value) 0.1)
                                         (round (-> % :args :authoritative-value) 0.1))
                                     #(= (:ret %) :correct))
              :incorrect-answer (s/and #(not= (round (-> % :args :student-value) 0.1)
                                              (round (-> % :args :authoritative-value) 0.1))
                                       #(= (:ret %) :incorrect))
              )
        )
+1

我怀疑您只是重复了foo中用于做出此决定的逻辑,因此我不认为添加:fn尤其有价值。通常只有当:fn可以验证参数和返回值之间的约束而独立于函数本身的逻辑时才有用。

by
对我来说,测试确实代表了一定程度的冗余,类似于会计的复式记账。因此,我写这个规范来在clojure.test中执行以验证函数的实现,作为编写常规测试的替代方法。

我提供的示例旨在帮助我更好地理解如何在规格说明中表达这些类型的关系,因为我在这方面是新手。
...