代码中有一些地方需要定义并仅在该处使用的函数。定义此类函数有2种主要方式,一种是无名函数
(map #(blepify-with blep (:blop %)) xs)
另一种是高阶函数
(map (comp (partial blepify-with blep) :blop) xs)
我个人不使用`partial`,总是更倾向于使用匿名函数,因为
- 匿名函数在调用时会进行变量引用,这意味着我可以重定义`blepify-with`,并且新定义会被自动使用。这在开发过程中非常有帮助,而且与直接链接一样,在生产环境中也能顺畅运行;
- `partial`通过隐藏函数参数数量使代码的可读性降低。明确比隐含好,Cursive可以立即显示我是否向函数传递了错误的参数数量
我也很少使用`comp`。除了关于变量引用相同的论点外,它还使我必须从右向左阅读代码。在小示例中这并不重要,但随着代码量的增长,线程宏大大提高了可读性。
唯一我觉得`comp`有用的时候是函数应用顺序与数据处理顺序相反,例如转换流(transducers):`(comp (filter even?) (map inc))`的意图是从左到右阅读。尽管`(map inc)`最先被调用,但经过该转换流处理的数据首先会通过`even?`谓词,然后通过`inc`转换。
我的问题是,`partial`和`comp`还有什么是我没注意到的吗?或许这仅仅是一个口味问题,我只是还没有习惯它们,也许它们同样具有可读性,而且不必重新定义使用位置的优点被高估了?我应该什么时候优先使用`comp`和`partial`而不是匿名函数?