【问题标题】:Ordering of parameters to make use of currying使用currying的参数排序
【发布时间】:2011-08-17 07:32:41
【问题描述】:

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

在设计函数签名时,哪些原则可以帮助我充分利用柯里化?

【问题讨论】:

    标签: haskell functional-programming currying partial-application


    【解决方案1】:

    我倾向于做你所做的,选择一些看起来不错的订单,然后在结果证明另一个订单更好时重构。顺序很大程度上取决于您将如何使用该功能(自然)。

    【讨论】:

      【解决方案2】:

      对于容易支持柯里化和部分应用的语言,有一系列令人信服的论点,最初来自 Chris Okasaki:

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

      为什么?然后你可以很好地compose operations on the data。例如。 insert 1 $ insert 2 $ insert 3 $ s。这也有助于functions on state

      标准库,例如“容器”follow this convention

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

      • 将变化最大的论点放在最后

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


      Okasaki 视图的总结在his Edison library 中给出(同样是另一个数据结构库):

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

      【讨论】:

      • 作为第一个要点的推论,也将可能存在于数据结构中的参数放在最后。它使地图、折叠和朋友更清洁。 tl;dr 列表中的东西排在最后。
      • 无论如何都不能链接查找,所以第一点不支持这一点。 haskell.org/haskellwiki/Parameter_order 反过来提出了一个有说服力的论点——“由于 Map 类型的对象表示映射,因此自然会有一些函数将 Map 对象转换为表示的函数。”
      【解决方案3】:

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

      【讨论】:

      • 如果您实际上将多个函数映射到同一个列表,也许您应该创建一个函数列表,并在该列表上使用map ($myList)
      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多