我们如何退回-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
无法执行此操作
答案 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