为什么Erlang中的模式匹配记录会抛出错误

Why does pattern matching records in Erlang throw error

你好,我正在尝试使用 Erlang 中的记录语法将变量绑定到封闭记录及其字段之一,但我不断收到此错误:

d:/Erlang/AeRlang/rec.erl:19: syntax error before: child

d:/Erlang/AeRlang/rec.erl:17: function isMale/1 undefined

d:/Erlang/AeRlang/rec.erl:17: Warning: function maleChildren/1 is unused

-module(rec).
-export([makeFam/0]).

-record(man,{name,
             age,
             children=[]}).
-record(child,{
    name,
    age,
    sex
}).

makeFam()->
    #man{name="Adrian",
         age=33,
         children=[#child{name="Daniel",age=33,sex="Male"},
                   #child{name="Chris" ,sex="Male"},
                   #child{name="Anne",age=33,sex="Female"}]
        }.


fatherAndSons(Man#man{children=Ch})->{Man,[Elem|| Elem<-Ch,isMale(Elem)]}.
    
isMale(C#child{_,_,Y})->
    case Y of 
        "Male"->true;
         _ ->false
    end.

我的 isMale method.I 有什么问题正在将封闭结构 #child 绑定到变量 C 并且我还在其 [=26] 上进行模式匹配=] 是问题吗?

P.S:这是否与在 isMale 方法中我没有指定我绑定的字段的名称有关变量 Y?

您的 child record 中获取 sex 的方式有一些错误。您可以像下面这样更改函数 fatherAndSons/1isMale/1

fatherAndSons(Man#man{children=Ch})->{Man,[Elem|| Elem<-Ch,isMale(Elem) == true]}.

isMale(C)->
    case C#child.sex of 
        "Male"->true;
         _ ->false
    end.

或者只删除列表理解中的 isMale/1 和模式匹配:

fatherAndSons(Man#man{children=Ch})->
    {Man, [Elem || Elem <-Ch, Elem#child.sex == "Male"]}.

对于 fatherAndSons/1isMale/1 函数,您使用了错误的语法来匹配记录作为函数参数。以下是一些更正后的版本:

fatherAndSons(Man=#man{children=Ch}) -> {Man, [Elem || Elem <- Ch, isMale(Elem)]}.

isMale(#child{sex="Male"})-> true;
isMale(_) -> false.

fatherAndSons/1 的函数头中,我们实际上是在说“Man 应该是一个 #man 记录,我们将绑定到 children 字段 Ch”。 = 运算符是进行匹配的,但是您在 Man 绑定中遗漏了它。

对于 isMale/1 我使用了两个子句,其中第一个子句匹配 sex 字段与字符串 "Male" 匹配的所有 #child 记录,第二个子句匹配还要别的吗。如果你想让第二个子句仅限于匹配 #child 记录,你可以改用:

isMale(#child{sex="Male"})-> true;
isMale(#child{}) -> false.

无论哪种方式,请注意,isMale/1 不需要将记录绑定到函数头中的变量,因为您不需要函数体中的绑定。