2012-10-16 22 views
3

我是Clojure的新手,所以最近幾天我一直在經歷Clojure Koans。事情進展順利,直到section on sequence comprehensions。我正在努力處理這一部分。 answers可用,但我不明白他們如何到達這些答案。在過去的兩天裏,我已經閱讀了很多關於Clojure的文章,但是和Ruby有很大的不同,它需要我花一些時間去理解它。Clojure Koans:麻煩理解序列理解部分

該部分有五個「問題」,我無法弄清楚。這兒有一些特別困惑我的問題的兩個例子:

"And also filtering" 
(= '(1 3 5 7 9) 
    (filter odd? (range 10)) 
    (for [index __ :when (odd? index)] 
    index)) 

"And they trivially allow combinations of the two transformations" 
(= '(1 9 25 49 81) 
    (map (fn [index] (* index index)) 
    (filter odd? (range 10))) 
    (for [index (range 10) :when __] 
    __)) 

對於經驗豐富的人使用Clojure,你能解釋他們是如何得出這一部分的解決方案?不管我讀了多少關於序列的東西,我都無法將這個部分包裹起來。謝謝!

回答

2

我假設你明白mapfilter函數,我猜他們也出現在Ruby中。讓我給你一個例子,可能這可以幫助你瞭解在這種情況下使用for

(map <some function to map a value> 
    (filter <some function to return true OR false to filter values> 
      <a sequence of values>)) 

上面的代碼不使用filter值的序列一些過濾,然後將過濾的序列的每個值映射到使用map功能的某個其它值。

for基本上可以讓你做同樣的事情,如下圖所示

(for [index <a sequence of values> 
    :when <some expression to return true OR false by check index value>] 
    (<some expression to map a value i.e transform index to something else>)) 

我希望上面的例子可以讓你能夠映射如何mapfilter碼,可以使用for

+0

謝謝,看到那些打字出來幫助了很多。 – rzv

0

你知道for的工作原理嗎?你有read about it in the Clojure API docs嗎?如果你知道如何使用for,那麼你就不需要做任何事情來「解決」這兩個問題的解決方案;他們將是不言而喻的。

這些問題的目的是爲了推斷for的工作原理。如果他們不幫助你做到這一點,那麼你最好閱讀這個主題。如果您在for上查找一些信息,但發現難以理解,請編輯此問題以確切指出令您感到困惑的內容,並且我(或其他人)可以嘗試解釋。

1

來表示,解釋起到了一定的作用,並且經過幾天的沉浸於Clojure之後,我對這種語言感覺更加舒適。爲了確保我能理解,我將通過這兩個測試。

"And also filtering" 
(= '(1 3 5 7 9) 
    (filter odd? (range 10)) 
    (for [index (range 10) :when (odd? index)] 
    index)) 

'(1 3 5 7 9)是0和9
(filter odd? (range 10))之間所有的奇數號碼的列表從集合返回(range 10)當針對odd?檢查評估爲真正的所有物品的清單。返回值等於第一個列表。
(for)基本上是for循環。它是迭代的。 (for [index (range 10)] index)將綁定0到9之間的所有數字到變量index,然後返回index,是否正確? 因此(for [index __ :when (odd? index)] index))增加了index是一個奇數的條件。返回值等於前兩個值。

這是正確的嗎?

"And they trivially allow combinations of the two transformations" 
(= '(1 9 25 49 81) 
    (map (fn [index] (* index index)) 
    (filter odd? (range 10))) 
    (for [index (range 10) :when (odd? index)] 
    (* index index))) 

這裏map功能需要一個功能。這個匿名函數接受一個參數並將其自身乘以該參數。 map將把這個函數應用到它傳遞的集合中的每個元素。該集合是介於0和9

for奇數將會從0設置每個數到9到可變index當它是奇數,然後與每個這些數字的平方返回懶惰序列。

我正確的解釋?