Clojure指定一个自然数

时间:2017-04-11 14:27:32

标签: clojure clojure.spec

natural number是非负整数。你会如何用Clojure Spec表达出来?

3 个答案:

答案 0 :(得分:5)

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

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

但请注意,匹配任意精度整数,如bigints:

(s/valid? nat-int? (bigint 1))
; false

答案 1 :(得分: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

答案 2 :(得分: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