Elixir新手 - 连接两个列表

时间:2018-03-26 18:26:47

标签: elixir

我是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不是正确的解决方案?它与模式匹配有关吗?谢谢!

1 个答案:

答案 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:你不需要在布尔值之前放置::truetrue相同。