回答
這是一個很好的問題。更準確地說:
Higher-order functions「採取或產生其他功能作爲參數或結果」。所以有兩種情況:
功能的功能。示例:
map
,reduce
,filter
。這些不是很難測試;只需提供所有參數,就像您對普通功能一樣。返回函數的函數。示例:
(fn [x] (fn [y] (+ x y)))
,(partial filter #(> % 1))
。 這些難以測試,因爲我們不能直接比較功能的平等(搜索內涵和外延的平等進行徹底的討論)。很明顯,沒有測試就不是一個很好的策略。那麼爲什麼不採用Haskell視圖,部分應用的函數與返回函數的函數基本相同 - 換句話說,將足夠的參數傳遞給返回的函數以獲得可以測試相等性的結果。
只要注意在測試中注意耦合 - 確保您的測試用例實際上測試的是高階函數的規格,而不僅僅是它返回的函數。
高階函數仍會返回結果,因此您仍然可以檢查它。
例如,如果您想測試map
,請考慮它應該做什麼:它應該獲得一個函數和一個集合作爲參數,將該函數應用於集合中的每個項目,返回一個新的集合結果。
所以測試的一個簡單的方法,這將是:
(is (= [1 2 3 4] (map inc [0 1 2 3]))
如果你正在測試一個高階函數是另一個函數的結果,同樣的原則也適用:你只是測試它返回什麼的應該在調用返回它的函數後:
(defn adder [n]
(fn [x]
(+ x n)))
(is (= ((adder 10) 5) 15))
希望這會有所幫助。
這實際上是有道理的。謝謝,我認爲我並沒有把功能看作是價值觀,而是想着別的東西。 只要沒有突變,如果高階函數爲lamda和list返回一致的值,它應該與傳遞的任何lambda函數一致。 非常感謝! –
但是關於函數返回閉包呢? –
你能舉個例子嗎?我不明白它爲什麼會有不同的表現。 – leonardoborges
- 1. Clojure中的高階函數
- 2. 調用Clojure的高階函數
- 3. 如何在Clojure中指定高階函數參數?
- 4. 測試Clojure的comp函數
- 5. 試圖讓高階函數在PowerShell中
- 6. 高階函數
- 7. 高階函數
- 8. haskell中的高階函數
- 9. Scala中的高階函數
- 10. Erlang中的高階函數
- 11. Javascript中的高階函數
- 12. 在高階函數中如何使用$?
- 13. 如何循環更高階的函數?
- 14. Clojure對象和封裝的高階函數
- 15. 高階javascript函數
- 16. 高階函數法
- 17. 高階函數javascripts
- 18. Haskell高階函數
- 19. Python高階函數
- 20. haskell:使用高階函數的階乘
- 21. 如何在Clojure中對函數進行基準測試?
- 22. 如何在clojure宏中測試未評估函數?
- 23. 如何記錄JavaScript高階函數?
- 24. Kotlin高階函數如何工作?
- 25. 如何加入兩個高階函數?
- 26. 更高階的reduce()函數
- 27. Haskell的高階函數
- 28. Clojure高階函數採用函數參數,但語法是什麼?
- 29. 如何從嵌套函數中返回對象?高階函數
- 30. 如何編寫私人clojure函數的單元測試?
在這個筆記,是宏測試以及特別是doXYZ的? –