Erlang 查找具有最小映射值的列表元素?

Erlang 查找具有最小映射值的列表元素?,erlang,Erlang,Erlang是否具有等效的 假设我有一个列表: [ [{right, 1}, {up, 5}, {left, 4}], %element 1 [{up, 2}, {right, 3}, {down, 1}], %element 2 ... % element N ] 以及将这些元素映射到标量的函数,例如: f([{right, 1}, {up, 5}, {left, 4}]) -> 78. f([{up, 2}, {right, 3}, {down, 1}]) -> 6

Erlang是否具有等效的

假设我有一个列表:

[
  [{right, 1}, {up, 5}, {left, 4}], %element 1
  [{up, 2}, {right, 3}, {down, 1}], %element 2
  ... % element N
]
以及将这些元素映射到标量的函数,例如:

f([{right, 1}, {up, 5}, {left, 4}]) -> 78.
f([{up, 2}, {right, 3}, {down, 1}]) -> 6.
现在我想找到映射到最小值的元素。在这个例子中,我想找到
[{up,2},{right,3},{down,1}]


Erlang的标准库如何帮助我做到这一点呢?

没有一个内置函数可以完全做到这一点,但您可以为此编写一个简单的尾部递归函数,该函数在纯Erlang中尽可能高效:

min_by([H|T], F) ->
  min_by(T, F, H, F(H)).

min_by([H|T], F, MinValue, MinMapped) ->
  case F(H) of
    NewMapped when NewMapped < MinMapped ->
      min_by(T, F, H, NewMapped);
    _ ->
      min_by(T, F, MinValue, MinMapped)
  end;
min_by([], _, MinValue, _) -> MinValue.

您可以使用以下事实:所有Erlang术语都是可比较的,元组具有字典顺序

MinBy = fun(L, F) ->
        {_, Min} = lists:min([{F(X), X} || X <- L]),
        Min
    end.
L = [
    [{right, 1}, {up, 5}, {left, 4}] %element 1
  , [{up, 2}, {right, 3}, {down, 1}] %element 2
].
F = fun([{right, 1}, {up, 5}, {left, 4}]) -> 78;
       ([{up, 2}, {right, 3}, {down, 1}]) -> 6
    end.
MinBy(L, F).
MinBy=fun(L,F)->
{,Min}=列表:Min([{F(X),X}| | x78;
([{up,2},{right,3},{down,1}])->6
结束。
明比(L,F)。

该死,这太好了!@Philip:很好,但比Dogbert的解决方案效率低一点。
MinBy = fun(L, F) ->
        {_, Min} = lists:min([{F(X), X} || X <- L]),
        Min
    end.
L = [
    [{right, 1}, {up, 5}, {left, 4}] %element 1
  , [{up, 2}, {right, 3}, {down, 1}] %element 2
].
F = fun([{right, 1}, {up, 5}, {left, 4}]) -> 78;
       ([{up, 2}, {right, 3}, {down, 1}]) -> 6
    end.
MinBy(L, F).