【发布时间】:2011-08-17 07:32:41
【问题描述】:
我最近两次重构代码以更改参数的顺序,因为有太多代码发生了像 flip 或 \x -> foo bar x 42 这样的黑客攻击。
在设计函数签名时,哪些原则可以帮助我充分利用柯里化?
【问题讨论】:
标签: haskell functional-programming currying partial-application
我最近两次重构代码以更改参数的顺序,因为有太多代码发生了像 flip 或 \x -> foo bar x 42 这样的黑客攻击。
在设计函数签名时,哪些原则可以帮助我充分利用柯里化?
【问题讨论】:
标签: haskell functional-programming currying partial-application
我倾向于做你所做的,选择一些看起来不错的订单,然后在结果证明另一个订单更好时重构。顺序很大程度上取决于您将如何使用该功能(自然)。
【讨论】:
对于容易支持柯里化和部分应用的语言,有一系列令人信服的论点,最初来自 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 中给出(同样是另一个数据结构库):
【讨论】:
首先放置最有可能重复使用的参数。函数参数就是一个很好的例子。您更可能希望 map f 处理两个不同的列表,而不是希望将许多不同的函数映射到同一个列表。
【讨论】:
map ($myList)。