3

自然数是一个非负整数。你会如何用 Clojure Spec 表达这一点?

4

3 回答 3

5

这已经是 1.9 中的谓词函数,它匹配固定精度非负整数:

(s/valid? nat-int? 1)
; true

但是请注意,这与 bigints 等任意精度整数不匹配:

(s/valid? nat-int? (bigint 1))
; false
于 2017-04-11T16:20:11.963 回答
1

您可以将其表示为integer?谓词的复合词以及它是否大于 0。

(spec/def ::natural-number
  (spec/and integer? (partial <= 0)))

(spec/exercise ::natural-number)
=> ([0 0] [0 0] [0 0] [1 1] [5 5] [5 5] [0 0] [0 0] [0 0] [19 19])

这匹配固定和任意精度整数:

(spec/valid? ::natural-number (long 0))
    => true
(spec/valid? ::natural-number (int 0))
    => true
(spec/valid? ::natural-number (bigint 0))
=> true
于 2017-04-11T14:27:32.377 回答
1

还有一个spec/int-in功能可以让你指定一个范围,比如

(spec/def ::natural-number
  (spec/int-in 0 Integer/MAX_VALUE))

(spec/exercise ::natural-number)
=> ([1 1] [1 1] [0 0] [0 0] [1 1] [3 3] [4 4] [4 4] [50 50] [1 1])

但是请注意,spec/int-in匹配任意精度整数,例如bigint

(spec/valid? (spec/int-in 0 Integer/MAX_VALUE) (bigint 1))
=> false
于 2017-04-11T14:30:07.530 回答