Clojure 指定一个自然数
Clojure Speccing a natural number
一个natural number是一个非负整数。你会如何用 Clojure Spec 表达这一点?
您可以将其表示为 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
还有一个 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
这已经是 1.9 中匹配固定精度非负整数的谓词函数:
(s/valid? nat-int? 1)
; true
但是请注意,这 不 匹配任意精度整数,如 bigints:
(s/valid? nat-int? (bigint 1))
; false
一个natural number是一个非负整数。你会如何用 Clojure Spec 表达这一点?
您可以将其表示为 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
还有一个 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
这已经是 1.9 中匹配固定精度非负整数的谓词函数:
(s/valid? nat-int? 1)
; true
但是请注意,这 不 匹配任意精度整数,如 bigints:
(s/valid? nat-int? (bigint 1))
; false