2017-03-12 1 views
4

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 onethis one과 관련이 있지만 답변에 의해 답변을 드릴 수 없습니다. (내 질문이 내가 찾지 못한 것의 복제물 인 경우, 기쁜 표정으로 표시하게되어 기쁩니다.)

+0

왜 함수가 어떤 데이터 구조를 사용하는지 알 수 없습니까? @ 조쉬는 네/아니오 질문에 "아니오"라고 응답하고 도움이되는 조언을 제공했습니다. 당신이하려는 일에 더 많은 정보가 없이는 당신을 도울 수 없습니다. 멀티 메소드를 사용해 보시겠습니까? –

+0

@Brandon에 질문 해 주셔서 감사합니다. 나는 잎 노드가 숫자의 비지도 모음이거나 벌거 벗은 숫자와 같은 다른지도 인지도 (지도 (지도 중 ...)의지도)로 돌아가고 있습니다. 나는 숫자의 각 모음에 대한 통계를 계산하려고하지만 맨손에 대해서는 계산하지 않습니다. 현재, 리프 콜렉션은 모든 시퀀스이지만, 함수를 좀 더 일반적으로 만들어서 세트를 처리 할 수는없는 이유는 무엇입니까? 또한 fl00r의 대답에 대한 내 의견을 참조하십시오. – Mars

답변

2

이 설명에 맞는 것으로 내가 찾거나 사용한 것은 아무것도 없습니다. 필자는 자신의 술어 기능이 명확하고 단순하며 코드에 포함하기가 쉽다고 생각한다.

아마도 매우 일반적인 코드를 작성하고있을 수도 있지만 일반적으로 함수가 일관된 데이터 형식을 받아들이고 반환하는 경우가 많습니다. 이것은 사실이 아닌 경우가 있지만 일반적으로 함수가 모든 거래의 잭이 될 수있는 경우 너무 많습니다.

예제를 사용하면 숫자 벡터, 숫자 목록 또는 숫자 집합을 추가하는 것이 좋습니다. 그러나 숫자의지도? 맵에 포함 된 값이 아닌 한이 코드는 이해가되지 않습니다.이 경우 순차적 데이터와 연관 데이터를 모두 추가하는 것이 단일 코드로 처리되는 것이 합리적이지 않습니다. 함수는 예상 한대로 전달되어야하며 일관된 결과를 반환해야합니다. 이런 점에서 스튜어트 시에라 (Stuart Sierra)의 blog post은 이러한 점에서 일관성에 대해 논의합니다. 더 많은 정보가 없으면 유스 케이스에 대해서만 추측하고 있지만 고려해야 할 사항입니다.

+0

감사합니다. Josh. Brandon과 fl00r에 대한 제 의견을 참조하십시오. – Mars

+1

2 개의 대답 중 하나를 받아 들일 때 임의로 선택하십시오. 이번엔 결국 누군가가 점수를 얻어야합니다. – Mars

3

예를 들어 (+ ... 적용) 또는 벡터, 목록, 게으른 시퀀스 및 세트와 함께 사용할 수 있습니다 (+ ... 감소),하지만이에 대해 아무것도지도

입니다하지 나는 생각한다. 귀하의 경우 일반 apply 또는 reduce 응용 프로그램과 관련이 없지만 특정 + 기능과 관련된 문제가 있습니다. (apply + [:a :b :c])은 여기에 벡터를 사용하고 있어도 작동하지 않습니다.

요점은 당신이 Clojure 자체에 일반적인 해결책이없는 이유는 바로 도메인 특정 문제를 해결하려고한다는 것입니다. 그래서 생각할 수있는 적절한 술어를 사용하십시오.

+0

저는 여러분의 요점을 이해 합니다만,지도를 제외한 모든 콜렉션에 공통적 인 것이 있다고 생각합니다 :지도의 요소는 항상'MapEntry'입니다. 다른 종류의 수집에 대해서는 사실이 아닙니다. 기본적으로지도를 제외한 모음은 임의로 선택한 유형의 요소 집합 (또는 순서가 중요하지 않은 경우 시퀀스)으로 처리 할 수 ​​있습니다. '+'는 일러스트레이션이었습니다 (Brandon의 코멘트에 대한 제 의견을 참조하십시오). 다른 유형의 요소와 같은 점을 만들 수 있습니다. 예 :'apply' 또는'reduce'에 전달 된 요소가 문자열 인지도가 없습니다. – Mars

+0

@Mars 알겠습니다. 그러나 다시, "시퀀스"관점의지도는 벡터의 목록입니다 (그럼에도 불구하고 MapEntry가 있지만). 따라서 맵'{: a 1 : b 2}'는 본질적으로리스트 ([: a 1], [: b 2])입니다. 맞습니까? 나는 이런 식으로 맵이 다르다는 것에 동의하지만,이 경우'맵? '술어는 매우 자연스럽고 매우 명백하게 보인다. – fl00r

+0

동의합니다. 'map? '은 많은 경우에 충분할 것입니다. 그러나,'(not (map? x))'는 비 콜렉션에 대해 참이므로, 비 맵 콜렉션을 식별하려면 연결 또는 분리가 필요합니다. 이제는이 의미의 인터페이스를 언어에 추가 할 수 있는지 여부를 생각하고 있습니다. 나는 그것이 좋은 생각이라고 생각하지만, RH 등으로 그것을 팔기는 어려울 것이다. – Mars