Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何仅接受规范中的有序集合_Clojure_Clojurescript_Clojure.spec - Fatal编程技术网

Clojure 如何仅接受规范中的有序集合

Clojure 如何仅接受规范中的有序集合,clojure,clojurescript,clojure.spec,Clojure,Clojurescript,Clojure.spec,我如何制作一个只接受顺序(即保留顺序的集合)的规范 比如说 cljs.user=> (s/def ::path (s/+ number?))

我如何制作一个只接受顺序(即保留顺序的集合)的规范

比如说

cljs.user=> (s/def ::path (s/+ number?))                                                                                                                                                                                 
:cljs.user/path
cljs.user=> (s/explain ::path [])                                                                                                                                                                                                                           
val: () fails spec: :cljs.user/path predicate: number?,  Insufficient input
:cljs.spec.alpha/spec  :cljs.user/path
:cljs.spec.alpha/value  [] 
cljs.user=> (s/explain ::path [1 2 3])                                                                                                                                                                                                                      
Success!
这是意料之中的,但同时,请注意顺序

cljs.user=> #{1 2 3}
#{1 3 2}
cljs.user=> (s/explain ::path #{1 2 3})                                                                                                                                                                                                                     
Success!
这似乎没有任何意义。因此,第二个问题是:

为什么序列相关表达式是cat、*、+、?在规范中接受序列中断集合

我把原问题中的顺序/顺序区分搞乱了。清理术语

如何制作只接受订单保留集合的规范

有一个clojure.core谓词函数排序?对于实现排序的集合,这将返回true

对于内容恰好已排序但未实现排序的集合,它不会返回true:

您可以在规范中使用任意谓词函数,因此您可以定义一个函数,该函数对于包含排序内容的集合返回true:

(defn ordered? [coll]
  (or (empty? coll) (apply <= coll)))

(ordered? [1 2 3])
=> true
如何制作只接受订单保留集合的规范

有一个clojure.core谓词函数排序?对于实现排序的集合,这将返回true

对于内容恰好已排序但未实现排序的集合,它不会返回true:

您可以在规范中使用任意谓词函数,因此您可以定义一个函数,该函数对于包含排序内容的集合返回true:

(defn ordered? [coll]
  (or (empty? coll) (apply <= coll)))

(ordered? [1 2 3])
=> true

序列的规范regex规范不应与顺序(即顺序集合)匹配。这是一个已在当前版本的规范中修复的错误,请参阅

在Clojure 1.10.0-RC5中,结果与预期一致:

(s/conform ::path [1 2 3])   ; => [1 2 3]
(s/conform ::path #{1 2 3})  ; => :clojure.spec.alpha/invalid

(s/explain ::path #{1 2 3})
;; #{1 3 2} - failed: (or (nil? %) (sequential? %)) spec: :user/path

您可以在最后一行中看到,正则表达式规范现在只匹配顺序值?

序列的规范正则表达式规范不应匹配顺序,即顺序集合。这是一个已在当前版本的规范中修复的错误,请参阅

在Clojure 1.10.0-RC5中,结果与预期一致:

(s/conform ::path [1 2 3])   ; => [1 2 3]
(s/conform ::path #{1 2 3})  ; => :clojure.spec.alpha/invalid

(s/explain ::path #{1 2 3})
;; #{1 3 2} - failed: (or (nil? %) (sequential? %)) spec: :user/path

您可以在最后一行中看到,正则表达式规范现在只匹配顺序值?

+表示1..n,就像在正则表达式中一样。这并不意味着任何秩序。您必须自己添加一个谓词。+表示1..n,就像在regexp中一样。这并不意味着任何秩序。你必须自己添加一个谓词。排序并不意味着排序……我用了不好的措词。我所说的有序不是指排序,而是保留顺序。有序不是指排序……我用了不好的措词。我所说的有序不是指排序,而是保持有序。
(s/conform ::path [1 2 3])   ; => [1 2 3]
(s/conform ::path #{1 2 3})  ; => :clojure.spec.alpha/invalid

(s/explain ::path #{1 2 3})
;; #{1 3 2} - failed: (or (nil? %) (sequential? %)) spec: :user/path