2011-08-11 3 views
2

Clojure에서 더 좋은 방법이 있습니까? 지도를 단수 또는 컬렉션으로 허용하려면

(if (coll? coll) 
    (map my-fn coll) 
    (my-fn coll) 

my-fn

coll 입력에인가한다. coll은 단수 또는 컬렉션 일 수 있습니다.

coll?을 확인하지 않으면 map을 단독으로 사용하면 xxx에서 ISeq을 만드는 방법을 알 수 없기 때문에 IllegalArgumentException이 발생합니다.

답변

4

코드가 멋지다. (변수 coll의 이름을 바꾸는 것은 실제로 컬렉션이 아닌지 알지 못하기 때문에 독자들에게는 혼란 스럽다.)

그러나 나는이 코드 전체가 의심스럽게 코드 냄새처럼 보일 것이라고 제안합니다. 역동적 인 타이핑을 너무 멀리하고 있습니다. 제 생각에는 약간 영리 해 지려고합니다. "cleverness considered harmful"의 의미로 말입니다.

대안 아이디어 고려해야 할 : 당신이 실제로 모음처럼 모든 것을 치료하려면

  • , 다음 단일 입력 값을 마무리 그들이 먼저 길이 1의 목록/벡터의 나머지 부분에서 얻을 때 코드는 처음부터 끝까지 컬렉션을 안전하게 유지할 수 있습니다.
  • 컬렉션 및 단일 값을 처리하기위한 별도의 함수를 작성하십시오. 이론적으로는 개념적으로 다른 데이터 유형이므로 다른 대우를받을 자격이 있습니다.
1

coll가 중첩 된 시퀀스를 포함하지 않는 경우 : my-fn이 목록을 받아 목록을 반환하는 함수가 될 수 있기 때문에 어떤 일반적인 솔루션은 존재하지 않는 수

(map my-fn (flatten (list coll))) 
1

합니다. 그런 다음 입력을 검사하여 매핑할지 여부를 결정할 수 없습니다.

자신이 어떤 데이터 유형을 가지고 있는지 모르는 상황에 빠져서는 안되지만 프로그램에 대해 더 알지 못하면 이에 대한 구체적인 조언을 드릴 수는 없습니다.

+0

실제로는 incanter.stats에서 정석입니다. –

관련 문제