回答
这是一个很好的问题。更准确地说:
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的comp函数
- 4. 试图让高阶函数在PowerShell中
- 5. 高阶函数
- 6. 高阶函数
- 7. Javascript中的高阶函数
- 8. haskell中的高阶函数
- 9. Erlang中的高阶函数
- 10. 在高阶函数中如何使用$?
- 11. Python高阶函数
- 12. Haskell高阶函数
- 13. 高阶函数法
- 14. Clojure对象和封装的高阶函数
- 15. haskell:使用高阶函数的阶乘
- 16. 如何在Clojure中对函数进行基准测试?
- 17. 如何在clojure宏中测试未评估函数?
- 18. 如何记录JavaScript高阶函数?
- 19. Kotlin高阶函数如何工作?
- 20. 如何加入两个高阶函数?
- 21. Haskell的高阶函数
- 22. 更高阶的reduce()函数
- 23. 如何从嵌套函数中返回对象?高阶函数
- 24. Clojure高阶函数采用函数参数,但语法是什么?
- 25. 递归函数的高阶函数?
- 26. JavaScript的高阶函数如何解释回调函数参数?
- 27. SML中的高阶函数作业
- 28. C++中的高阶函数«filter»
- 29. 了解Javascript中的高阶函数
- 30. 重构Scala中的高阶函数?
在这个笔记,是宏测试以及特别是doXYZ的? –