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

kub*_*sub 2 elixir

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

def zip_sports_and_leagues(
  [%Sport{} | _tail] = sports,
  [%League{} | _tail] = leagues
) do
  # Do stuff with `sports` and `leagues`
end
Run Code Online (Sandbox Code Playgroud)

当第一个列表有多个项目时,我正在使用该函数获得"无函数子句匹配"错误.

我已经将代码剥离到这个最小的例子:

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]
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么我得到函数子句错误以及如何解决它?

谢谢!

Dog*_*ert 8

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

def zip_sports_and_leagues(
  [%Sport{} | _tail] = sports,
  [%League{} | _tail2] = leagues
) do
  # Do stuff with `sports` and `leagues`
end
Run Code Online (Sandbox Code Playgroud)

或使用_不绑定值并且可以多次使用:

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