Elixir - 无法在匹配内调用远程函数

时间:2016-02-21 15:25:53

标签: compiler-errors pattern-matching elixir

我正在练习练习练习,无法弄清楚为什么我会收到以下错误:

(CompileError) anagram.exs:19: cannot invoke remote function String.codepoints/1 inside match
(stdlib) lists.erl:1353: :lists.mapfoldl/3
(stdlib) lists.erl:1353: :lists.mapfoldl/3

我想我并不理解模式匹配,因为我不太明白我是如何在匹配中调用远程函数的。以下是上下文测试套件的几个示例:

defmodule AnagramTest do
  use ExUnit.Case

test "no matches" do
  matches = Anagram.match "diaper", ["hello", "world", "zombies", "pants"]
  assert matches == []
end

test "detect simple anagram" do
  matches = Anagram.match "ant", ["tan", "stand", "at"]
  assert matches == ["tan"]
end

这是我的代码:

defmodule Anagram do
  @doc """
  Returns all candidates that are anagrams of, but not equal to, 'base'.
  """
  @spec match(String.t, [String.t]) :: [String.t]
  def match(base, candidates) do
    base
    |> String.codepoints
    |> Enum.sort
    |> scan_for_matches(candidates)
  end

  defp scan_for_matches(base, candidates) do
    Enum.scan candidates, [], &(if analyze(&1, base), do: &2 ++ &1)
  end

  defp analyze(candidate, base) do
    candidate
    |> String.codepoints
    |> Enum.sort
    |> match?(base)
  end

  defp match?(candidate, base) do
    candidate == base
  end
end

我不只是将变量传递给analyze/2函数,以便最终返回boolean吗?我很欣赏任何见解。

1 个答案:

答案 0 :(得分:3)

这确实需要一个答案,所以我想我会将其添加进来。match?/2是默认情况下从Kernel导出的函数。您可以通过import Kernel, except: [match?: 2]覆盖默认导入。