Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir的新功能-连接两个列表_Elixir - Fatal编程技术网

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

我是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.([: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
也将被分配列表中的值。