Elixir:函数签名中的多列表模式匹配

Elixir:函数签名中的多列表模式匹配,elixir,Elixir,我试图创建一个函数,它接受两个列表作为参数,并且每个列表(a)不是空的,并且(b)是某个结构的列表。这样的东西可以满足我的需要: def zip_sports_and_leagues( [%Sport{} | _tail] = sports, [%League{} | _tail] = leagues ) do # Do stuff with `sports` and `leagues` end 当第一个列表有多个项时,我得到一个与该函数匹配的“no function子句”错误 我

我试图创建一个函数,它接受两个列表作为参数,并且每个列表(a)不是空的,并且(b)是某个结构的列表。这样的东西可以满足我的需要:

def zip_sports_and_leagues(
  [%Sport{} | _tail] = sports,
  [%League{} | _tail] = leagues
) do
  # Do stuff with `sports` and `leagues`
end
当第一个列表有多个项时,我得到一个与该函数匹配的“no function子句”错误

我已将代码精简为以下示例:

defmodule Test do
  def test([a | _tail], [b | _tail]) do
    1
  end
end

Test.test([1], [1])
=> 1

Test.test([1, 1], [1])
** (FunctionClauseError) no function clause matching in Test.test/2

    The following arguments were given to Test.test/2:

        # 1
        [1, 1]

        # 2
        [1]
有人能告诉我为什么会出现function子句错误以及如何修复它吗


谢谢

问题是两个参数的尾部使用了相同的名称:
\u tail
。当函数参数中的一个名称被使用两次时,该子句仅在两者具有相同值时匹配。您可以重命名其中一个:

def zip_sports_and_leagues(
  [%Sport{} | _tail] = sports,
  [%League{} | _tail2] = leagues
) do
  # Do stuff with `sports` and `leagues`
end
或者使用不绑定值且可多次使用的

def zip_sports_and_leagues(
  [%Sport{} | _] = sports,
  [%League{} | _] = leagues
) do
  # Do stuff with `sports` and `leagues`
end