Erlang 如何获得复杂的函数引用?

Erlang 如何获得复杂的函数引用?,erlang,Erlang,当动态指定模块并将其传递给高阶函数时,如何获取对模块中函数的引用 例: 只是,这不会编译。一种方法是将对目标函数的调用包装成匿名的形式,但我想知道是否有直接获取引用的方法。来自以下文档: 我们也可以引用一个函数 在另一个模块中使用 以下语法: F = {Module, FunctionName} 在这种情况下,函数必须为 从相关模块导出 例如,您可以执行以下操作: -module(test). -export([compare/2, test/2]). compare(X, Y) whe

当动态指定模块并将其传递给高阶函数时,如何获取对模块中函数的引用

例:


只是,这不会编译。一种方法是将对目标函数的调用包装成匿名的形式,但我想知道是否有直接获取引用的方法。

来自以下文档:

我们也可以引用一个函数 在另一个模块中使用 以下语法:

F = {Module, FunctionName}
在这种情况下,函数必须为 从相关模块导出

例如,您可以执行以下操作:

-module(test).

-export([compare/2, test/2]).

compare(X, Y) when X > Y ->
    true;
compare(X, Y) ->
    false.

test(Mod, List) ->
    lists:sort({Mod, compare}, List).


1> test:test(test, [1,3,2]).
[3,2,1]

为了记录在案,有一项建议使这成为可能。是的,但它是不久前从pu树中产生的。@Travis Webb-当然,erlang是一种动态语言,它使这种事情成为可能。例如,可以使用Mod:hello()调用动态指定模块中的函数。注意大写:Mod是一个变量。你可以做到。在这种情况下,正如我前面提到的,通过将动态调用包装成匿名的fun并将其传递给“sort”,问题就可以解决了。只是想要一个更干净的方式。本例的目的是让几个不同的模块知道该列表的排序方式,并且直到运行时才知道该由哪个模块负责。不要使用此选项!这个“特性”已经被严重弃用(它是在funs被添加到Erlang之前发明的),有一天可能会被完全删除。我认为HiPE根本拒绝处理它。正如您所说,在EEP 23实现之前,您可以使用fun(…)->M:F(…)end这样的包装器。我不知道EEP-23+1对于这种方法。可能值得在官方文档中为该示例添加一个注释。
-module(test).

-export([compare/2, test/2]).

compare(X, Y) when X > Y ->
    true;
compare(X, Y) ->
    false.

test(Mod, List) ->
    lists:sort({Mod, compare}, List).


1> test:test(test, [1,3,2]).
[3,2,1]