有没有一种惯用的方法来对Erlang中的函数参数进行排序?

有没有一种惯用的方法来对Erlang中的函数参数进行排序?,erlang,Erlang,在列表模块中似乎不一致。例如,split的第一个参数是number,第二个参数是list,但是sublist的第一个参数是list,第二个参数是len。不,在您的意思中没有一致使用的习惯用法 然而,这里有一些有用的相关提示,特别是在进行深度递归调用时。例如,以参数列表中相同的顺序/位置保留尾部调用期间保持不变的参数可以让虚拟机进行一些非常好的优化。好的,我记得一些历史和我风格背后的一些原则 正如Christian所说,图书馆不断发展,并倾向于从我们当时的冲动中获得论证顺序和感受。例如,eleme

在列表模块中似乎不一致。例如,split的第一个参数是number,第二个参数是list,但是sublist的第一个参数是list,第二个参数是len。

不,在您的意思中没有一致使用的习惯用法


然而,这里有一些有用的相关提示,特别是在进行深度递归调用时。例如,以参数列表中相同的顺序/位置保留尾部调用期间保持不变的参数可以让虚拟机进行一些非常好的优化。

好的,我记得一些历史和我风格背后的一些原则

正如Christian所说,图书馆不断发展,并倾向于从我们当时的冲动中获得论证顺序和感受。例如,element/setelement之所以具有参数顺序,是因为它与Prolog中的arg/3谓词匹配;当时是合乎逻辑的,但现在不是。通常我们会先把事情做好,但不幸的是并不总是这样。这通常是一个很好的选择,因为它允许在末尾方便地添加“可选”参数;例如字符串:substr/2/3。以thing作为最后一个参数的函数通常会受到函数语言curry的影响,例如Haskell,在Haskell中,使用curry和部分求值来构建特定的函数非常容易,然后这些函数可以应用于thing。这在列表中的高阶函数中非常明显

我们唯一没有的影响来自OO世界。:-)

通常,我们至少设法在一个模块内保持一致,但并非总是如此。再次查看列表。我们确实尝试了一些一致性,因此dict/集合中高阶函数的参数顺序与列表中相应函数的参数顺序相匹配

我们,尤其是我,对图书馆的态度相当傲慢,这一事实也加剧了这个问题。我只是不认为它们是语言的卖点,所以我并不担心。我的座右铭是:“如果你想要一个做某事的图书馆,那你就写下来。”。这意味着我的库是结构化的,只是不总是具有相同的结构。:-)最初的图书馆就是这样产生的

当然,这造成了不必要的混乱,违反了最小惊奇法则,但我们对此无能为力。任何修改模块的建议总是遭到响亮的“反对”

我自己的个人风格通常是结构化的,尽管我不知道它是否符合任何书面准则或标准

我通常把我正在研究的一件或几件事情作为第一个论点,或者至少非常接近开始;顺序取决于什么感觉最好。如果有一个全局状态链接到整个模块(通常是这样),它将作为最后一个参数放置,并给出一个非常描述性的名称,如St0、St1、。。。(我属于短变量名教会)。通过函数(输入和输出)链接的参数我尝试保持与返回顺序相同的参数顺序。这使得查看代码的结构更加容易。除此之外,我尝试将属于同一类的论点组合在一起。此外,在可能的情况下,我尝试在整个模块中保持相同的参数顺序

这些都不是很革命性的,但是我发现如果你保持一致的风格,那么你就不用担心它了,它会让你的代码感觉更好,而且通常更可读。如果参数顺序感觉不正确,我也会重写代码

一个可能有帮助的小例子:

fubar({f,A0,B0}, Arg2, Ch0, Arg4, St0) ->
    {A1,Ch1,St1} = foo(A0, Arg2, Ch0, St0),
    {B1,Ch2,St2} = bar(B0, Arg4, Ch1, St1),
    Res = baz(A1, B1),
    {Res,Ch2,St2}.
这里,
Ch
是通过变量链接的局部状态,
St
是更全局的状态。如果您想要更长的示例,请查看github for LFE上的代码,尤其是编译器

抱歉,这比它应该的时间长了很多


另外,为了避免对我所说的内容产生混淆,我使用了thing而不是object这个词。

不,这是一个混乱的局面,因为图书馆的设计与其说是随着它们的发展而发展。等待韦尔丁的回答并遵循他的风格。:)可能是因为我来自OO背景,但似乎所有在列表上操作的函数都应该将列表作为第一个参数问:我应该将参数放在哪里?答:争论应该留在原地。听起来像是古老的智慧:o)