Ale*_*ein 0 erlang functional-programming if-statement
我试图做一个方法,它检查两个原子的值,如果它们相互之间它会说它是假的,反之亦然,如果它们不相同它就会是真的.
我的代码看起来像这样:
b_not(X, Y) ->
if
X=:=Y ->
false;
else
true;
end.
Run Code Online (Sandbox Code Playgroud)
这里我的方法的名称是"b_not",它代表boolean_not.如果X完全等于Y,我会用if语句检查它会说假.好吧,我可以做的那部分.但是当我尝试制作else语句时,问题出现了.我似乎没有得到这一部分,我试图在互联网上搜索,但我似乎没有得到它.所以如果你能告诉我if-else语句在Erlang中是如何工作的,我会很高兴的!
谢谢阿列克谢!
我对Erlang比较陌生,但这种语言并不是按照你描述的方式工作的.有一个if构造,但我不相信它经常被使用.
相反,您所描述的内容可以使用模式匹配来实现:
b_not(_X, _X) -> false;
b_not(_, _) -> true.
Run Code Online (Sandbox Code Playgroud)
下划线模式匹配表示通配符; 模式匹配以下划线开头意味着您不打算在函数中使用该值,但您确实关心匹配本身.
所以第一个模式匹配意味着"我不打算将_X用于任何东西,但两个值必须相同."
第二种模式匹配意味着"这些是一次性价值观,可以是任何东西."
许多函数都使用多个参数模式定义,Erlang决定哪些模式与调用匹配.
在这种情况下,如果相同的值被传递两次,无论是整数,原子,列表还是任何其他类型,第一个模式将匹配并返回false.否则,第二个模式匹配.
这只能起作用,因为模式是按此顺序定义的; 如果他们被撤销,任何争论都会导致真实.
插图:
16> foo:b_not(3, 3).
false
17> foo:b_not(3, 4).
true
19> foo:b_not(3, 3.0).
true
20> foo:b_not(match, match).
false
21> foo:b_not(match, nomatch).
true
22> foo:b_not([1, 2], [1, 2]).
false
23> foo:b_not([1, 2], [1, 2, 3]).
true
Run Code Online (Sandbox Code Playgroud)
这就是=/=
操作员所做的!
b_not(X, Y) -> X =/= Y.
Run Code Online (Sandbox Code Playgroud)
我能理解你对if
陈述的困惑.你应该真正阅读手册中的if和guard,因为if
它不像许多其他语言那样工作.这是在Erlang中实现它的一种方法(但"如果真实则真实"是一种反模式,所以不要这样做):
if
X =/= Y -> true;
X =:= Y -> false
end
Run Code Online (Sandbox Code Playgroud)
请注意,当其中一个警卫(箭头左侧)评估为true
原子时,该if
语句将评估该箭头后面的表达式.没有任何else
条款,但你可以通过true
在箭头前面发明一个:
if
X =/= Y -> true;
true -> false
end
Run Code Online (Sandbox Code Playgroud)
这不是非常直观,特别是对于来自其他语言背景的人来说,并且我认为这是模式匹配通常优于if
表达式的一个原因.
为了完整起见,请阅读案例表达式.它用于在函数体内进行模式匹配:
case X of
Y -> false; % X equals Y
_ -> true % Everything else, i.e., X is not Y
end
Run Code Online (Sandbox Code Playgroud)