Clojure 술어가 "콜렉션이지만 맵은 아닌"것을 의미합니까?지도가 아닌 컬렉션 술어?
맵을 제외한 모든 콜렉션에서 수행 할 수있는 조작이 많기 때문에 이러한 술어는 유용합니다. 예를 들어 (apply + ...)
또는 (reduce + ...)
은 벡터, 목록, 지연 시퀀스 및 집합과 함께 사용할 수 있지만지도가 아닌 경우 해당 문맥의지도 요소가 clojure.lang.MapEntry
으로 끝납니다. 그것은 내가 아는 그 조건으로 문제가 발생할 세트 및지도의 :
sequential?
는 벡터,리스트, 게으른 시퀀스 사실을하지만지도와 세트 모두 거짓입니다. (seq?
은 비슷하지만 벡터에 대해서는 거짓입니다.)coll?
및seqable?
은 세트와지도뿐만 아니라 내가 생각할 수있는 다른 모든 종류의 컬렉션에도 해당됩니다.
물론 이러한 술어를 정의 할 수 있습니다. 이 같은 :
(defn coll-but-not-map?
[xs]
(and (coll? xs)
(not (map? xs))))
또는 같은
:(defn sequential-or-set?
[xs]
(or (sequential? xs)
(set? xs)))
내가 같은 일을하는 clojure.core 내장 (또는 기여 라이브러리) 술어가인지 궁금하네요.
이 질문은 this one과 this one과 관련이 있지만 답변에 의해 답변을 드릴 수 없습니다. (내 질문이 내가 찾지 못한 것의 복제물 인 경우, 기쁜 표정으로 표시하게되어 기쁩니다.)
왜 함수가 어떤 데이터 구조를 사용하는지 알 수 없습니까? @ 조쉬는 네/아니오 질문에 "아니오"라고 응답하고 도움이되는 조언을 제공했습니다. 당신이하려는 일에 더 많은 정보가 없이는 당신을 도울 수 없습니다. 멀티 메소드를 사용해 보시겠습니까? –
@Brandon에 질문 해 주셔서 감사합니다. 나는 잎 노드가 숫자의 비지도 모음이거나 벌거 벗은 숫자와 같은 다른지도 인지도 (지도 (지도 중 ...)의지도)로 돌아가고 있습니다. 나는 숫자의 각 모음에 대한 통계를 계산하려고하지만 맨손에 대해서는 계산하지 않습니다. 현재, 리프 콜렉션은 모든 시퀀스이지만, 함수를 좀 더 일반적으로 만들어서 세트를 처리 할 수는없는 이유는 무엇입니까? 또한 fl00r의 대답에 대한 내 의견을 참조하십시오. – Mars