Functional programming Erlang if-else语句
我试着做一个方法,它检查两个原子的值,如果它们彼此相等,它会说它是假的,反过来说,如果它们不相等,它就会是真的 我的代码如下所示:Functional programming Erlang if-else语句,functional-programming,erlang,if-statement,Functional Programming,Erlang,If Statement,我试着做一个方法,它检查两个原子的值,如果它们彼此相等,它会说它是假的,反过来说,如果它们不相等,它就会是真的 我的代码如下所示: b_not(X, Y) -> if X=:=Y -> false; else true; end. 这里我的方法的名称是“b_not”,它代表布尔值。我用if语句检查X是否等于Y,它会说false。好吧,那部分我一个人能做。 但我的问题是,当我试着做else陈述时。 我似乎不明白这部分,我试着在网上搜索,但我似乎
b_not(X, Y) ->
if
X=:=Y ->
false;
else
true;
end.
这里我的方法的名称是“b_not”,它代表布尔值。我用if语句检查X是否等于Y,它会说false。好吧,那部分我一个人能做。
但我的问题是,当我试着做else陈述时。
我似乎不明白这部分,我试着在网上搜索,但我似乎不明白。
因此,如果您能告诉我if-else语句在Erlang中是如何工作的,我将非常高兴
谢谢阿列克谢 我对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
这就是
=/=
操作符所做的
b_not(X, Y) -> X =/= Y.
我能理解你对if
语句的困惑。您应该认真阅读手册中的和,因为if
在许多其他语言中不起作用。这是在Erlang中实现它的一种方法(但“如果为true,则为true”是一种反模式,所以不要完全这样做):
请注意,当其中一个防护(箭头左侧)计算为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
end
答案的可能重复可能也会有所帮助。您不会在此处使用X,因为在另一个参数中使用了X应该表示它根本不被使用。唯一的原因是当你匹配一个更复杂的结构时,例如一个元组或列表。卢卡斯,除非我忽略了你的观点,你需要x x作为两个参数来声明它们是相同的(虽然埃米尔的答案是更好的,我甚至没有考虑过/=)。重点是你应该有ByNo(x,x),而不是ByNo(x x,x x)。第二个中的_X表示未使用变量,这显然不是事实。使用下划线表示未在正文中使用它。参考手册中:“以下划线(_)开头的变量,例如_Height,是普通变量,不是匿名变量。但是编译器会忽略它们,因为它们不会为未使用的变量生成任何警告。”当然,也可以这样使用,我的观点是,您不应该这样做,因为这会使任何阅读代码的人感到困惑。但也许这正是我与之一起编程的人。
case X of
Y -> false; % X equals Y
_ -> true % Everything else, i.e., X is not Y
end