订购参数以利用currying

Joh*_*ler 92 haskell functional-programming currying partial-application

我有两次最近重构的代码,以便更改参数的顺序,因为有太多的代码,黑客喜欢flip\x -> foo bar x 42正在发生.

在设计功能签名时,哪些原则可以帮助我充分利用currying?

Don*_*art 109

对于容易支持currying和partial-application的语言,有一个引人注目的系列论点,最初来自Chris Okasaki:

  • 将数据结构作为最后一个参数

为什么?然后,您可以很好地编写数据操作.例如insert 1 $ insert 2 $ insert 3 $ s.这也有助于国家的功能.

标准库如"容器" 遵循此约定.

有时会给出替换参数以将数据结构放在第一位,因此可以将其关闭,从而在静态结构(例如查找)上产生更简洁的函数.然而,广泛的共识似乎是,这不是一个胜利,特别是因为它推动你走向高度括号的代码.

  • 把最多变的论点放在最后

对于递归函数,通常将变量最大的参数(例如累加器)作为最后一个参数,而在开始时改变最小参数(例如函数参数).这与最后一种风格的数据结构很好地吻合.


他的Edison库(同样,另一个数据结构库)中给出了Okasaki视图的摘要:

  • 部分应用程序:更可能是静态的参数通常出现在其他参数之前,以便于部分应用.
  • 集合最后出现:在操作查询单个集合或修改现有集合的所有情况下,集合参数将显示在最后.这是Haskell数据结构库事实上的标准,并为API提供了一定程度的一致性.
  • 最常见的顺序:操作表示多个数据结构上众所周知的数学函数,选择参数以匹配函数的最常见参数顺序.


ham*_*mar 11

放置最有可能首先重用的参数.函数参数就是一个很好的例子.您想要map f在同一列表上映射许多不同的功能,您更有可能想要超过两个不同的列表.

  • 如果你实际上是在同一个列表中映射许多函数,那么你可能应该创建一个函数列表,并在该列表上添加`map($ myList)`. (5认同)