我是Elixir的新手,我试图创建一个简单的匿名函数来连接两个原子列表。
正确地说,编写的代码是:
concat = fn(x,y) -> x ++ y end
此代码也适用于其他数据类型。
我的问题是,以下代码怎么办?
list_concat = fn([:a,:b],[:c,:d]) -> [:a,:b,:c,:d] end
当我在函数中写入时,Iex不会抛出,但如果我尝试运行list_concat
,则抛出以下内容:
> list_concat.([:true,:false],[:false,:true])
** (FunctionClauseError) no function clause matching in :erl_eval."-inside
an-interpreted-fun-"/2
The following arguments were given to :erl_eval."-inside-an-interpreted-fun-
"/2:
# 1
[true, false]
# 2
[false, true]
有人可以帮我弄清楚堆栈跟踪的含义,以及为什么list_concat
不是正确的解决方案?它与模式匹配有关吗?谢谢!
答案 0 :(得分:2)
原子只匹配自己。您只能使用list_concat
和[:a,:b]
作为参数调用[:c,:d]
函数。如果要将变量绑定到用户传递的任何值,只需删除:
:
iex(1)> list_concat = fn [a, b], [c, d] -> [a, b, c, d] end
#Function<12.99386804/2 in :erl_eval.expr/5>
iex(2)> list_concat.([:true, :false], [:false, :true])
[true, false, false, true]
PS:你不需要在布尔值之前放置:
。 :true
与true
相同。