Elixir的新功能-连接两个列表
我是Elixir的新手,我正在尝试创建一个简单的匿名函数,将两个原子列表连接起来 正确地说,编写的代码是:Elixir的新功能-连接两个列表,elixir,Elixir,我是Elixir的新手,我正在尝试创建一个简单的匿名函数,将两个原子列表连接起来 正确地说,编写的代码是: concat = fn(x,y) -> x ++ y end 此代码也适用于其他数据类型 我的问题是,为什么下面的代码不起作用 list_concat = fn([:a,:b],[:c,:d]) -> [:a,:b,:c,:d] end 当我写入函数时,Iex不会抛出,但如果我尝试运行list\u concat,则会抛出以下内容: > list_concat.([:t
concat = fn(x,y) -> x ++ y end
此代码也适用于其他数据类型
我的问题是,为什么下面的代码不起作用
list_concat = fn([:a,:b],[:c,:d]) -> [:a,:b,:c,:d] end
当我写入函数时,Iex不会抛出,但如果我尝试运行list\u 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\u 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]
iex(1)>list_concat=fn[a,b],[c,d]->[a,b,c,d]结束
#作用
iex(2)>列表显示。([:真,:假],:假,:真])
[真,假,假,真]
PS:您不需要将:
放在布尔值之前:true
与true
相同,那么这是否意味着说fn([:a,:b])
,我将传递实际的:a和:b原子?如果是这样的话,这是有道理的,谢谢你的澄清<代码>fn
采用匹配的模式。其中的模式是[:a,:b]
。唯一可以匹配此模式的值是[:a,:b]
。另一方面,任何长度为2的列表都将匹配模式[a,b]
。在此匹配中,a
和b
也将被分配列表中的值。