Elixir - Tidak dapat menjalankan fungsi jarak jauh di dalam pertandingan

Saya sedang mengerjakan latihan latihan dan tidak tahu mengapa saya mendapatkan kesalahan berikut:

(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

Saya kira saya tidak memahami pencocokan pola sebaik yang saya kira karena saya tidak begitu mengerti bagaimana saya mencoba memanggil fungsi jarak jauh di dalam kecocokan. Berikut adalah beberapa contoh rangkaian pengujian untuk konteks:

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

Ini kode saya:

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

Bukankah saya hanya meneruskan variabel ke fungsi analyze/2 sehingga pada akhirnya mengembalikan boolean? Saya menghargai wawasan apa pun.


person jsonkenl    schedule 21.02.2016    source sumber
comment
Saya pikir masalahnya ada pada fungsi match?/2, saya belum mencoba menemukan kesalahan lain dalam kode tetapi akan dikompilasi jika saya mengubah fungsi itu ke fungsi lain. Pasti sesuatu yang dilindungi undang-undang.   -  person NoDisplayName    schedule 21.02.2016
comment
@JustMichael, itu dia. Terima kasih untuk bantuannya. Jika Anda ingin mempostingnya sebagai jawaban, saya akan memberi Anda penghargaan untuk itu.   -  person jsonkenl    schedule 21.02.2016


Jawaban (1)


Ini memang membutuhkan jawaban, jadi saya rasa saya akan menambahkannya. match?/2 adalah fungsi yang diekspor dari Kernel secara default. Anda dapat mengganti impor default melalui import Kernel, except: [match?: 2].

person asonge    schedule 22.02.2016