erlang - Erlang 中缺少可变参数的解决方法

标签 erlang variadic-functions function-composition

对 Erlang 完全陌生。我正在尝试为函数组合定义一些函数,例如 compose , juxtpipe但是遇到这样一个事实,即 Erlang 没有(据我所知)可变参数,因此很难只编写适用于所有输入的此类函数的一个版本。

到目前为止,我最好的想法是将不同数量的函数硬编码到一个合理的数量,并提供一个版本,该版本需要更大的列表,如下所示:

pipe (X, Fs) when is_list(Fs) -> lists:foldl(fun (F, Acc) -> F(Acc) end, X, Fs);
pipe (X, F) -> F(X).
pipe (X, F, G) -> G(F(X)).
pipe (X, F, G, H) -> H(G(F(X))).
pipe (X, F, G, H, I) -> I(H(G(F(X)))).
pipe (X, F, G, H, I, J) -> J(I(H(G(F(X))))).
pipe (X, F, G, H, I, J, K) -> K(J(I(H(G(F(X)))))).
pipe (X, F, G, H, I, J, K, L) -> L(K(J(I(H(G(F(X))))))).

哪个有效,但我很好奇是否有更好的方法?

最佳答案

问题是 Erlang 函数由 Name/Arity 唯一标识。 ; io:format/1io:format/2 ,例如,是两个不同的函数。因此,可变参数函数根本不适合 Erlang。

最干净的解决方案可能是您建议的。另一种选择是编写自定义 parse transform (一个在解析之后但在编译之前重写 AST 的模块)以捕获和转换对您想要的特定函数的调用,让其他人不受干扰地通过。转换可以拦截像 pipe(A1, A2, A3, ..., An) 这样的调用。并将它们改写为 pipe([A1, A2, A3, ..., An]) .

但请注意:解析转换可能很难正确处理,并且必须在需要使用它们提供的功能的每个模块中明确引用它们。 Basho 的 Lager 是一个很好地使用解析变换的例子。日志库。

关于erlang - Erlang 中缺少可变参数的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15511418/

相关文章:

haskell - Haskell 中类型的推理

android - 聊天应用程序中的低分辨率缩略图管理

erlang - 使用 Erlang 生成 RSA key 对?

erlang - ejabberd:有没有办法配置与 "cookie"不同的 "ejabberd"?

C++11 可变参数 Printf 性能

c++ - 传递可变参数时保留引用

erlang - 与 simple_one_for_one 主管一起开始一个 child

c++ - Va_list 访问第二个参数

scheme - 如何在这里反转谓词?

scala - 是否有可能在 finagle 中有一个通用的日志过滤器,在 andThens 链中可以是 "inserted anywhere"?