haskell - 使用currying参数的排序

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

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

3个解决方案
103 votes

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

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

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

标准库如“容器”遵循此约定。

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

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

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


Okasaki视图的摘要在他的Edison库中提供(同样,另一个数据结构库):

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

放置最有可能首先重用的参数。 函数参数就是一个很好的例子。 您可能希望在两个不同的列表上使用map f,而不是希望在同一列表上映射许多不同的功能。

hammar answered 2019-09-04T04:03:30Z
3 votes

我倾向于做你做的事情,选择一些好看的订单然后重构,如果事实证明另一个订单更好。 订单很大程度上取决于您将如何使用该功能(当然)。

augustss answered 2019-09-04T04:03:54Z
translate from https://stackoverflow.com:/questions/5863128/ordering-of-parameters-to-make-use-of-currying