2017-11-27 5 views
1

이런 기본적인 질문은 죄송하지만이 기능이 작동하는 이유를 알 수 없습니다. "Clojure for the brave and true" 가이드를 수행하고 있습니다. 이 컬렉션에 : 내가 이해할 수없는 것은 사용하는 것입니다 3.clojure : 왜 (일부 # (및 ... 처음 false 항목을 반환하지 않음)

(some #(and (> (:critter %) 3) %) food-journal) 

위의 값을 가진 생물 :

(def food-journal 
    [{:month 1 :day 1 :human 5.3 :critter 2.3} 
    {:month 1 :day 2 :human 5.1 :critter 2.0} 
    {:month 2 :day 1 :human 4.9 :critter 2.1} 
    {:month 2 :day 2 :human 5.0 :critter 2.5} 
    {:month 3 :day 1 :human 4.2 :critter 3.3} 
    {:month 3 :day 2 :human 4.0 :critter 3.8} 
    {:month 4 :day 1 :human 3.7 :critter 3.9} 
    {:month 4 :day 2 :human 3.7 :critter 3.6}]) 

이 기능의 사용 키를 가지고하는 최초의지도를 얻을 수 있습니다 내 생각에 내부 표현식에서 반환 된 첫 false 값을 반환해야합니다. 즉, 그것은 그지도의 : critter가 3보다 크지 않기 때문에 첫 번째지도를 반환해야합니다.

+1

여기서'와'는'when'과 같은 일을합니다. –

답변

2

some은 술어 함수가 논리 값을 반환 할 때까지 food-journal의 각 요소에 대한 술어 함수를 평가합니다.

컬렉션의 각 항목 (예 : {:month 1 :day 1 :human 5.3 :critter 2.3})은 자체적으로 true로 평가됩니다.

따라서 술어 함수는 :critter> 3이 아닌 콜렉션의 모든 항목에 대해 false를 생성해야합니다.

and 요소 자체가 AND : critter> 3가 true로 평가되면 true로 평가됩니다.

여기서 복잡한 부분은 논리 AND 소자 자체 및 비교보다 큰로부터 부울 값 사이에 존재한다는 것이다.

따라서 항상 or이 항상 true이므로 항상 첫 번째 요소를 반환하므로보다 큰 테스트는 무시됩니다.

2

여기의 열쇠는 some이 술어 기능을 사용하는 방법입니다.

coll의 모든 x에 대한 (pred x)의 첫 번째 논리 참 값을 반환합니다 ( else nil).

그래서 and 반환이 아닌 사실, some은보고 계속합니다. %이 최종 and 양식으로 된 이유는 (> (:critter %) 3)이 아닌 some이 일치하는 실제 항목을 반환하기 때문입니다.

+1

고맙습니다. 나는 나를 혼란스럽게 생각하는 이유는'(와)'에 대한 나의 생각은 진실을 무시하고 허위로 돌려 보내는 것이 목적이라는 것입니다. 그러나 여기에서, 여러분이 말했듯이 모든 거짓 표현은 반환되지만'(some)'에 의해 무시됩니다. 마침내 진실을 평가할 때 목록의 마지막 항목 (지도)을 반환하고 그지도를'(일부)'로 보내 진리로 평가하여'(일부) '로 받아들입니다. – maxorcist