【发布时间】:2022-12-01 15:50:53
【问题描述】:
我有一个整数和原子混合的列表。我想将列表的头部与原子匹配,否则为整数。
lst = [1,2,3,4,5,6, :eoe, 7,8,9,10,11,12. :eoe]
我最初尝试过这种方式:
defmodule Test do
def test(lst) do
helper(lst, 0, 0, 1)
end
def helper([], _p, total, e) do
IO.puts "#{e} #{t}"
end
def helper([:eoe , t], _p, total, e) do # <--- This function never called even though head is at some point :eoe
IO.puts "#{e} #{total}"
helper(t, "", 0, elf + 1)
end
def helper([h | t], p, total, e) do
h
|> is_atom()
|> IO.inspect()
helper(t, h, total + h, e)
end
end
然后添加守卫以明确缩小模式匹配范围
...
def helper([:eoe = head , t], _p, total, e) when is_atom(head) do
...
def helper([h | t], p, total, e) when is_integer(h) do
...
def helper([:eoe = h , t], _p, total, e) when is_atom(h) do这个函数没有被调用。它总是匹配def helper([h | t], p, total, e) when is_integer(h) do这个。我什至把前一个放在后一个之前。我希望它与:eoe匹配
【问题讨论】:
-
尝试使用
[:eoe = h | t]而不是[:eoe = h, t];) -
我不敢相信这是一个语法错误。我快疯了。 @BrujoBenavides
标签: list functional-programming erlang elixir pattern-matching