参数的sorting,以利用咖喱
我有两次最近重构的代码,以改变参数的顺序,因为有太多的代码,像flip
或\x -> foo bar x 42
黑客发生。
当devise一个函数签名时,哪些原则会帮助我充分利用currying?
对于容易支持柯里化和部分应用的语言,有一个引人注目的系列的论点,最初来自Chris Okasaki:
- 把数据结构作为最后一个参数
为什么? 然后,您可以很好地对数据进行操作 。 例如, insert 1 $ insert 2 $ insert 3 $ s
。 这也有助于国家的职能 。
标准库如“容器” 遵循这个约定 。
有时会给出一些替代的参数来把数据结构放在第一位,这样就可以closures它,在静态结构(比如查找)上产生更加简洁的函数。 然而,广泛的共识似乎是,这不是一个胜利,特别是因为它把你推向严格括号的代码。
- 把最不同的论点放在最后
对于recursion函数,通常把variables最大的参数(例如累加器)作为最后一个参数,而最开始variables最less的参数(例如函数参数)。 这与数据结构的最后一个样式很好地组合。
Okasaki视图的摘要在他的Edison库 (又一个数据结构库)中给出:
- 部分应用 :更可能是静态的参数通常出现在其他参数之前,以便于部分应用。
- 集合最后出现 :在操作查询单个集合或修改现有集合的所有情况下,集合参数将最后出现。 这是Haskell数据结构库事实上的标准,并为API提供一定程度的一致性。
- 大多数通常的顺序 :如果一个操作在多个数据结构上表示一个众所周知的math函数,则select参数以匹配该函数最常用的参数顺序。
首先放置最有可能重用的参数。 函数参数就是一个很好的例子。 你更想将map f
到两个不同的列表上,而不是想要在同一个列表上映射许多不同的函数。
我倾向于做你所做的事情,挑选一些看起来不错的订单,然后重构,如果事实certificate另一个订单更好。 顺序很大程度上取决于你如何使用函数(自然)。