我在iex中注意到运行[1] = [ head | tail ]
会导致编译错误。但是,如果您定义一个函数,例如:
def simple_func([ head | tail ]) do
IO.inspect(head)
IO.inspect(tail)
end
这个论点似乎很匹配。我假设发生了什么事情,我很想知道它是什么。
答案 0 :(得分:6)
匹配的模式位于=
的左侧,而不是右侧:
iex(1)> [head | tail] = [1]
[1]
iex(2)> head
1
iex(3)> tail
[]
答案 1 :(得分:1)
Tail是剩余列表。在一个参数的列表中,它只是一个空列表,所以它实际匹配。
答案 2 :(得分:0)
有三种情况 1.头部和尾部之前未定义:
iex(1)> [1] = [head | tail]
** (CompileError) iex:5: undefined function head/0
(stdlib) lists.erl:1353: :lists.mapfoldl/3
(stdlib) lists.erl:1354: :lists.mapfoldl/3
使用匹配值定义head和tail
iex(1)> head = 1
1
iex(2)> tail = []
[]
iex(3)> [1] = [head|tail]
在这种情况下,头部和尾部的组合([head|tail]
)等于[1]
如此匹配且没有错误
头部和尾部定义为不匹配的值
`
iex(1)> head = 2
2
iex(2)> tail = []
[]
iex(3)> [1] = [head|tail]
** (MatchError) no match of right hand side value: [2]
在这种情况下,head和tail([head|tail]
)的组合等于[2]
所以匹配错误