Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming Erlang if-else语句_Functional Programming_Erlang_If Statement - Fatal编程技术网

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