簡體   English   中英

Clojure矢量作為函數參數

[英]Clojure vector as function parameter

由於完全缺乏clojure經驗,並且自大學以來沒有任何函數式編程實踐,我試圖解釋一些示例代碼來找出clojure語法。

我開始編寫幾個版本的Fibonacci( https://gist.github.com/pcalcao/ea4176719d778ea3ab9e ),但我仍然不能說我完全理解更復雜的形式。

例如,這個:

(defn fib_map [n]
  (last (take (+ n 1)
    (map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))))   

我很難真正理解這段代碼的最內層部分:

fn [[a b]] [b (+ a b)] 

現在,根據我的理解,我們正在創建一個匿名函數,它接收一個參數,一個帶有兩個值的向量(這是解構,對吧?),然后返回另一個向量。

現在,我們這樣做的原因是什么,而不是:

fn [a b] [b (+ a b)]

這些是等價的嗎? 或者我們只是讓我們的匿名函數接收一個參數作為iterate使用的“噱頭”?

對不起,如果這是非常明顯的,但就像我說的那樣,類似Lisp的語言還不是我的強項。

你已經自己弄清楚了。

形式(fn [[ab]] ...)正在使用解構。 它需要一個參數,它應該是一個矢量或支持clojure的nth函數的另一種類型的對象。 使用解構,它將前兩個值“拉”出向量並將它們分配給局部變量ab

形式的函數(fn [ab] ...)是兩個參數的函數。 這兩者並不相同。

你必須在iterate使用(fn [[ab]] ...)形式的原因是iterate僅適用於單參數函數。

這是因為迭代只需要兩個參數,即一個函數和一個參數。 比照 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM