我试图用一种方法来检查两个原子的值,如果它们是等价的,它会说它是假的,相反,如果它们不是等价的,它就会是真的。
我的代码如下所示:
b_not(X, Y) ->
if
X=:=Y ->
false;
else
true;
end.这里,我的方法名为"b_not“,它代表boolean_not。如果X和Y完全相等的话,我用if -语句来检验,它会说假。好吧,那部分我一个人可以做。但当我试着做其他的陈述时我的问题就来了。我似乎不明白这部分,我试着在网上搜索,但我似乎不明白。所以,如果你能告诉我,如果-否则-声明如何工作在Erlang,我会很高兴!
谢谢阿列克谢!
发布于 2012-09-12 13:06:15
我对Erlang比较陌生,但这种语言的设计并不像你所描述的那样。有一个if结构,但我不认为它经常使用。
相反,可以使用模式匹配来实现您所描述的内容:
b_not(_X, _X) -> false;
b_not(_, _) -> true.下划线模式匹配表示通配符;在模式匹配之前加上下划线意味着您不打算在函数中使用该值,但您确实关心匹配本身。
因此,第一个模式匹配意味着“我不打算将_X用于任何事情,但这两个值必须是相同的。”
第二个模式匹配的意思是“这些是丢弃的值,可以是任何东西。”
许多函数都是用多个参数模式定义的,Erlang为您决定哪种模式与调用匹配。
在这种情况下,如果一个相同的值被传递两次,无论是整数、原子、列表还是任何其他类型,第一个模式将被匹配并返回false。否则,匹配第二个模式。
这只是因为模式是按照这个顺序定义的;如果它们被反转,任何参数都会导致true。
插图:
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发布于 2012-09-12 14:29:08
这就是=/=操作符所做的!
b_not(X, Y) -> X =/= Y.我可以理解您对if语句的困惑。您应该在手册中阅读有关如果和卫兵的内容,因为if不像许多其他语言那样工作。这是在Erlang中实现这一目标的一种方法(但是“如果是,那么是真的”是一种反模式,所以不要这么做):
if
X =/= Y -> true;
X =:= Y -> false
end注意,当其中一个守卫(箭头左侧)计算为true原子时,if语句将计算为该箭头后面的表达式。没有else子句,但是您可以自己发明一个,将true放在箭头前面:
if
X =/= Y -> true;
true -> false
end这不是很直观,特别是对来自其他语言背景的人来说,我认为这是模式匹配通常比if表达式更可取的原因之一。
为了完整起见,也要阅读案例表达。它用于在函数体内进行模式匹配:
case X of
Y -> false; % X equals Y
_ -> true % Everything else, i.e., X is not Y
endhttps://stackoverflow.com/questions/12388456
复制相似问题