【问题标题】:New to Elixir - Concatenate two listsElixir 新手 - 连接两个列表
【发布时间】:2018-09-04 23:56:31
【问题描述】:

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

【问题讨论】:

    标签: elixir


    【解决方案1】:

    一个原子只匹配它自己。您只能使用[:a,:b][:c,:d] 作为参数调用list_concat 函数。如果您想将变量绑定到用户传递的任何值,只需删除:

    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 相同。

    【讨论】:

    • 那么这是否意味着说fn([:a,:b]),我会传入实际的:a 和:b 原子?如果是这样,那是有道理的,感谢您的澄清!
    • fn 采用模式进行匹配。这里的模式是[:a, :b]。可以匹配此模式的唯一值是[:a, :b]。另一方面,任何长度为 2 的列表都将匹配模式 [a, b]。在这场比赛中,ab被分配列表中的值。
    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 2019-04-03
    • 2023-04-09
    • 1970-01-01
    • 2017-12-09
    • 2012-01-13
    • 2019-03-23
    • 1970-01-01
    相关资源
    最近更新 更多