如何从Elixir中的Enum.max_by返回函数值以及返回的元素

时间:2018-04-26 17:37:22

标签: elixir

我们如何退回-filter:links以及function value来自Elixir的returned element

我有这个案子:

Enum.max_by/3

仅知道最佳匹配项是不够的,我还需要知道匹配的阈值保持并消除0.7以下的不良匹配

使用def fuzzy_match(x, items) do m = Enum.max_by(items, fn i -> TheFuzz.compare(:jaro_winkler, x.desc, i.desc) end) IO.puts("fuzzy: #{inspect(m)}") m end 无法执行此操作

2 个答案:

答案 0 :(得分:1)

Enum.reduce不允许这样做。您可以在返回的值上再次调用该函数,或者如果这不是一个选项(例如,如果该函数具有副作用或计算成本很高),如果输入是一个,您可以使用defmodule A do def max_by_with_value([h | t], f) do Enum.reduce(t, {h, f.(h)}, fn x, {max, max_value} -> value = f.(x) if value > max_value, do: {x, value}, else: {max, max_value} end) end end IO.inspect A.max_by_with_value([1, 4, 3], &(&1 * 2)) 这样的列表:

{4, 8}

输出:

dummy variables

答案 1 :(得分:1)

因为Enum.max_by仍然是贪婪的(没有办法判断是否在没有检查所有元素的情况下找到了最大值),我会采用比[完美的工作方式]更简单(也更易读)的方法] @ Dogbert的一个。首先映射所有内容,然后调用正常的Enum.max_by

def fuzzy_match(x, items) do
  items
  |> Enum.map(& {&1, TheFuzz.compare(:jaro_winkler, x.desc, &1.desc)})
  |> Enum.max_by(fn {_, jw} -> jw end)
end