为什么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/1
和 isMale/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/1
和 isMale/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
不需要将记录绑定到函数头中的变量,因为您不需要函数体中的绑定。
你好,我正在尝试使用 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/1
和 isMale/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/1
和 isMale/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
不需要将记录绑定到函数头中的变量,因为您不需要函数体中的绑定。