我最近两次重构代码以更改参数的顺序,因为代码太多,黑客喜欢flip
or \x -> foo bar x 42
正在发生。
在设计函数签名时,哪些原则可以帮助我充分利用柯里化?
对于轻松支持柯里化和部分应用的语言,有一系列令人信服的论点,最初来自 Chris Okasaki:
为什么?那么你可以对数据进行组合操作 http://www.haskell.org/pipermail/libraries/2005-August/004297.html很好。例如。insert 1 $ insert 2 $ insert 3 $ s
。这也有助于状态函数 http://www.haskell.org/pipermail/libraries/2005-August/004323.html.
“容器”等标准库遵循这个约定 http://hackage.haskell.org/packages/archive/containers/0.4.0.0/doc/html/Data-Map.html#g:5.
有时会给出替代参数以将数据结构放在第一位,因此可以将其封闭,从而在静态结构(例如查找)上产生更简洁的函数。然而,广泛的共识似乎是这并不是一个胜利,特别是因为它迫使你使用大量括号的代码。
对于递归函数,通常将变化最大的参数(例如累加器)作为最后一个参数,而将变化最小的参数(例如函数参数)放在开头。这与最后一种数据结构风格很好地结合在一起。
冈崎观点的总结见他的爱迪生图书馆 http://hackage.haskell.org/packages/archive/EdisonAPI/1.2.1/doc/html/Data-Edison.html(同样,另一个数据结构库):
-
部分申请:更可能是静态的参数通常出现在其他参数之前,以便于部分应用。
-
集合出现在最后:在操作查询单个集合或修改现有集合的所有情况下,集合参数将出现在最后。这是 Haskell 数据结构库事实上的标准,并为 API 提供了一定程度的一致性。
-
最常见的顺序:如果一个运算代表多个数据结构上的众所周知的数学函数,则选择参数以匹配该函数最常用的参数顺序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)