2017-11-27 5 views
1

この基本的な質問は申し訳ありませんが、なぜこの関数が機能するのか分かりません。clojure:なぜ(いくつかの(そして...)最初のfalse項目を返さない)

(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}]) 

とキー持っている最初のマップを取得するには、この機能の使用:3.

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

上記の値を持つ生き物は、私が理解できないことを使用することである。このコレクションの際に(and)私の意見では、内部式から返された最初のfalse値を返すべきです。そのマップの:critterが3より大きくないので、最初のマップを返す必要があります。

+1

ここで、 'と'は 'when'と同じ仕事をしています。 –

答えて

2

someは、述語関数が論理真値を返すまで、food-journal内の各要素の述語関数を評価します。

コレクション内の各アイテム({:month 1 :day 1 :human 5.3 :critter 2.3}など)は、単独で評価されます。

したがって、述語関数は、:critter> 3ではないコレクション内のすべての項目に対してfalseを返す必要があります。

and要素自体AND::critter> 3がtrueと評価された場合、trueと評価されます。

ここで紛らわしい部分は、論理AND素子自体、及び比較より大きいからブール値の間に存在することです。

したがって、代わりにorが常に真であるため、最初の要素が常に返され、それ以上のテストは無視されます。

2

ここでのキーは、someがどのように述語関数を使用しているかです。

else nilのcollの任意のxの最初の論理真値(pred x)を返します。

したがって、andがtrue以外を返すと、someは見た目が変わりません。 %が最終and形式である理由は、(> (:critter %) 3)ではなく、someが一致した実際の項目を返すようになっているためです。

+1

ありがとうございます。私は私を混乱させているのは、 '(と)'という私の考えは、真実を無視して真実を無視するという目的であるということです。しかしここで、あなたが言うように、すべての偽の表現が返されますが、 '(ある)'によって無視されます。最終的に真実を評価すると、代わりにリストの最後の項目(マップ)が返され、そのマップは '(ある)'に送られ、真実として評価され、 '(some)'によって受け入れられます。 – maxorcist

関連する問題