回答

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