参数排序以利用curring


Answers:


111

对于容易支持currying和部分应用程序的语言,有一系列引人注目的论点,它们最初来自Chris Okasaki:

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

为什么?然后,您可以很好地对数据进行操作。例如insert 1 $ insert 2 $ insert 3 $ s。这也有助于实现状态功能

诸如“容器”之类的标准库遵循此约定

有时会给出替代参数以将数据结构放在首位,因此可以将其关闭,从而在静态结构(例如查找)上产生更为简洁的函数。但是,广泛的共识似乎是这不是一个胜利,尤其是因为它会促使您使用带有大量括号的代码。

  • 将最有争议的论点放在最后

对于递归函数,通常将变化最大的参数(例如累加器)作为最后一个参数,而变化最小的参数(例如函数参数)放在开头。这与数据结构的最后样式很好地结合在一起。


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

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

作为第一个要点的推论,也将可能存在于数据结构中的参数放在最后。它使地图,折页和朋友变得更加清洁。tl; dr列表中的内容排在最后。
约翰·米勒

1
无论如何都不能将查找链接起来,因此第一点不支持这一点。haskell.org/haskellwiki/Parameter_order相反地提出了一个令人信服的论点-“由于Map类型的对象表示映射,因此自然会有一些函数将Map对象转换为所表示的函数。”
布兰登

11

首先放置最可能重用的参数。函数参数就是一个很好的例子。你更可能要map f在两个不同的列表,比你想许多不同的功能在同一个目录映射。


5
如果实际上是在同一个列表上映射许多函数,则也许应该列出一个函数列表,然后map ($myList)在该列表上。
乌贼

3

我倾向于做您所做的事情,选择一些看起来不错的订单,然后在发现其他订单更好的情况下进行重构。顺序很大程度上取决于您将如何(自然地)使用该功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.