The clojure document gives the following examples:
(take 10 (iterate (partial + 2) 0))
(def powers-of-two (iterate (partial * 2) 1))
(take 10 powers-of-two)
(def fib (map first (iterate (fn [[a b]] [b (+ a b)]) [1 1])))
(take 10 fib)
Anyone can explain the syntax of clojure’s iterate function in more detail? I am very confused with all the usage. Why two brackets are there in (fn [[a b]] [b (+ a b)])?
Another example can be found here:
(defn iter [[x y]]
(vector y (+ x y)))
(nth (iterate iter [0 1]) 10000)
iteratetakes a functionfand an initial valuexand produces a lazy sequence. The first element in the seq isx. Each subsequent element is computed by callingfwith the previous element.Example 1:
This generates a sequence, starting at 0, where each element is the previous element with 2 added to it. I.e.:
Each element in the seq is passed to
(partial + 2)when generating the following element.Example 2:
This generates a sequence, starting at 1, where each element is the previous element multiplied by 2. I.e.:
Again, you can see how each element feeds into the generation of the next one.
Example 3:
Firstly,
(fn [[a b]] ...)is a way to destructure a value into parts. In this case, the function accepts a two-element vector and unpacks it into the local variablesaandb.The function returns a two-element vector containing
band the sum ofaandb(i.e. the second value in the previous pair and the sum of both values in the previous pair).With this in mind, this
iteratecall generates:Then
(map first ...)grabs the first value in each pair, which gives you your Fibonacci sequence.