代码中有些地方需要仅定义和使用一次的函数,它们定义的地方就是它们的使用地方。定义此类函数主要有两种方式,第一种是匿名函数
(map #(blepify-with blep (:blop %)) xs)
另一种是高阶函数
(map (comp (partial blepify-with blep) :blop) xs)
我个人很少使用partial
,并且总是优先选择匿名函数,因为
- 匿名函数在调用时需要进行变量解引用,这意味着我可以在开发中重新定义
blepify-with
,并且新定义会自动使用。这在开发中非常有用,在生产环境中与直接链接一样高效;
partial
通过隐藏函数参数数量,使代码可读性降低。明确性优于隐晦性,Cursive可以立即告诉我是否给函数传递了错误的参数数量
我也很少使用comp
。除了变量解引用的相同问题之外,它会使我不得不从右到左阅读代码。在小示例中这真的无关紧要,但当代码量增加时,threading宏会大大提高可读性。
我发现comp
有用的唯一一次是当函数应用的反序被数据处理的反序抵消时,例如transducers:(comp (filter even?) (map inc))
按从左到右的顺序读取。尽管首先调用(map inc)
,但这个transducer处理的数据将首先通过even?
谓词,然后通过inc
转换。
我的问题是,我是否遗漏了有关partial
和comp
的更多内容?也许这只是口味问题,我只是还没有习惯它们,它们本身就是可读的,而且不需要重新定义使用位置是过时的?我应该在什么情况下优先选择comp
和partial
函数而不是匿名函数?