【问题标题】:Erlang - Why do these two expressions not match?Erlang - 为什么这两个表达式不匹配?
【发布时间】:2014-03-02 20:04:18
【问题描述】:

我有这个案例陈述:

case {[{atom1,A1},{atom2,A2}],false} of

                {[{A,B},{C,D}], false} -> {A,B}
            end.

还有其他情况,但我把它们删掉了。

我不明白为什么会出现以下错误:

** 异常错误:没有匹配 {[{atom1,A1},{atom2,A2}],false} 的 case 子句 在函数 expr:myFunct/1 中(myModule.erl,第 391 行)

为什么 {[{atom1,A1},{atom2,A2}],false} 不等于 {[{A,B},{C,D}],false}?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    case 子句模式匹配时,ABCD(或所有这些)中的任何一个可能已经绑定到某个值,这与它不同应该是为了匹配。

    为了匹配,必须在模式匹配发生时满足以下条件:

    • A 必须是未绑定的,否则它必须包含值 atom1
    • B 必须是未绑定的,否则它必须包含与 A1 相同的值
    • C 必须是未绑定的,否则它必须包含值 atom2
    • D 必须是未绑定的,否则它必须包含与 A2 相同的值

    【讨论】:

      【解决方案2】:

      相等。除非变量 A 或 C 已经绑定到某个值。

      【讨论】:

        【解决方案3】:

        确实如此。如果ABCD 中的至少一个已经具有不匹配的绑定值,则问题可能是您的周围代码。

        $ erl
        Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
        
        Eshell V5.10.4  (abort with ^G)
        1> A1 = foo, A2 = bar.
        bar
        2> case {[{atom1,A1},{atom2,A2}],false} of
        2> 
        2>                 {[{A,B},{C,D}], false} -> {A,B}
        2>             end.
        {atom1,foo}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-24
          • 2011-09-17
          • 2014-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多