回答

4

這是一個很好的問題。更準確地說:

Higher-order functions「採取或產生其他功能作爲參數或結果」。所以有兩種情況:

  1. 功能的功能。示例:map,reduce,filter。這些不是很難測試;只需提供所有參數,就像您對普通功能一樣。

  2. 返回函數的函數。示例:(fn [x] (fn [y] (+ x y))),(partial filter #(> % 1))。 這些難以測試,因爲我們不能直接比較功能的平等(搜索內涵和外延的平等進行徹底的討論)。

    很明顯,沒有測試就不是一個很好的策略。那麼爲什麼不採用Haskell視圖,部分應用的函數與返回函數的函數基本相同 - 換句話說,將足夠的參數傳遞給返回的函數以獲得可以測試相等性的結果。

    只要注意在測試中注意耦合 - 確保您的測試用例實際上測試的是高階函數的規格,而不僅僅是它返回的函數。

+0

在這個筆記,是宏測試以及特別是doXYZ的? –

2

高階函數仍會返回結果,因此您仍然可以檢查它。

例如,如果您想測試map,請考慮它應該做什麼:它應該獲得一個函數和一個集合作爲參數,將該函數應用於集合中的每個項目,返回一個新的集合結果。

所以測試的一個簡單的方法,這將是:

(is (= [1 2 3 4] (map inc [0 1 2 3])) 

如果你正在測試一個高階函數是另一個函數的結果,同樣的原則也適用:你只是測試它返回什麼的應該在調用返回它的函數後:

(defn adder [n] 
    (fn [x] 
    (+ x n))) 

(is (= ((adder 10) 5) 15)) 

希望這會有所幫助。

+0

這實際上是有道理的。謝謝,我認爲我並沒有把功能看作是價值觀,而是想着別的東西。 只要沒有突變,如果高階函數爲lamda和list返回一致的值,它應該與傳遞的任何lambda函數一致。 非常感謝! –

+0

但是關於函數返回閉包呢? –

+0

你能舉個例子嗎?我不明白它爲什麼會有不同的表現。 – leonardoborges