2012-09-08 43 views
9

我學習Clojure的Koans:反覆應用功能

https://github.com/functional-koans/clojure-koans/blob/master/src/koans/10_lazy_sequences.clj

我停留在這一個:

"Iteration can be used for repetition" 
    (= (repeat 100 :foo) 
    (take 100 (iterate ___ :foo))) 

我不知道確切的內置功能填寫空白,所以我試着寫我自己的。我把它作爲一個單獨的函數寫成測試。

我打算這樣做:如果x是一個seq,那麼就重複它的第一個元素。否則,讓它成爲一個seq。

(def f (fn [x] (if (seq? x) (cons (first x) x) (cons x '())))) 

當我明確地運行它,它看起來不錯:

user=> (f :abc) 
(:abc) 
user=> (f (f :abc)) 
(:abc :abc) 
user=> (f (f (f :abc))) 
(:abc :abc :abc) 

但使用iterate增加了一個額外的括號:

user=> (take 1 (iterate f :abc))(:abc) 
user=> (take 2 (iterate f :abc)) 
(:abc (:abc)) 
user=> (take 3 (iterate f :abc)) 
(:abc (:abc) (:abc :abc)) 

What causes this? 
+7

順便說一句,確切的內建函數是標識 – status203

+1

是的。不幸的是,我無法弄清楚公司,並看着別人的解決方案。 – mparaz

+1

koans並不總是建立你的知識;我確切地知道我想要的功能,但是因爲Clojure有很多內置的概念,所以直到我來到這裏,我才知道它被稱爲身份! –

回答

5

重新讀取documentationiterate

Ret甕x的懶序列,(FX),(F(FX))等

使用nth而不是take如果你想要一個特定的迭代結果:

 
user=> (nth (iterate f :abc) 0) 
:abc 
user=> (nth (iterate f :abc) 1) 
(:abc) 
user=> (nth (iterate f :abc) 2) 
(:abc :abc) 
user=> (nth (iterate f :abc) 3) 
(:abc :abc :abc) 
+1

謝謝。我在那裏感到困惑。 – mparaz

9
(fn [x] x) 

解決了這個特殊的公案

+0

也是''identity' – user1011471

2

我已經與#(keyword %)

解決了這個問題我已經試過#(%)但它不起作用。有人知道爲什麼

+0

我用'keyword'解決了它。我也試過'#(%)'。問題是匿名函數仍將表單中的第一項作爲函數處理,因此最終將foo作爲一個沒有參數的函數處理。這也適用於'#(do%)'。 – Matimus

+0

我也可以用#( - >%)代替 –

+3

我後來遇到了clojure.core的一部分'identity',並返回傳遞給它的任何東西。 – Matimus