ERLANG + IF + BOOLEAN - PullRequest
       8

ERLANG + IF + BOOLEAN

0 голосов
/ 07 февраля 2019
Boolean x = true;
int y = 1;
int z = 1;
if(y ==1 && x == true){
    z++;
    x = false;
}
else{
    z--;
    x = true;
}

Я хочу сделать это на эрланге .. Как я могу это сделать?(Обратите внимание, что это пример кода. То, что я хочу сделать, это два условия в одном операторе if и эта логическая функциональность).Любая помощь приветствуется. На самом деле z-- & z ++ не нужны.

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019
Boolean x = true;
...
    x = false;

Эрланга никогда не случится.Переменные Erlang могут быть назначены только один раз, что также означает, что вы не можете использовать var++ и var-- в erlang.

Вы можете использовать так называемые охранники в головепредложения функции для использования логических фильтров в аргументах функции.В страже запятая действует как && на других языках, а точка с запятой действует как ||.

-module(my).
-compile(export_all).

            guard: Y==1 && X
         +----------+
         |          |  
         |          |
go(X, Y) when Y==1, X ->
      false;
go(_, _) ->
      true.

go_test() ->
    false = go(true, 1),
    true = go(false, 1),
    true = go(true, 20),
    all_tests_passed.

В оболочке:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(my).       
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> my:go_test().
all_tests_passed

3> 

Per Wotjek Surowkago/2 можно написать проще без охранников.Поскольку существует только одна комбинация аргументов, где результат равен false, а все другие комбинации аргументов дают результат true, вы можете написать:

go(true, 1) ->
    false;
go(_, _) ->
    true.
0 голосов
/ 08 февраля 2019

Если вы программируете функциональный язык, особенно Erlang, пожалуйста, избегайте даже думать об операторе if, хотя случай Erlang это поддерживает.

Всегда думайте о соответствии шаблона.

0 голосов
/ 07 февраля 2019

Вы можете использовать оператор case

* этот пример всегда будет повторять кортеж с двумя элементами {Z, X}

case_statement() ->

  X  = true,
  Y  = 1,
  Z  = 1,

  case {Y, X} of
    {1, true} ->
      {Z + 1, false};
    _ ->
      {Z -1, true}
  end.

Если вам нужно использовать точное выражение 'if' здесьпример

if_statement() ->

  X  = true,
  Y  = 1,
  Z  = 1,

  if
    Y =:= 1 andalso X =:= true ->
      {Z +1, false};
    true ->
      {Z -1, true}
  end.
...