Как создать последовательность действий в середине выражения в ReasonML (и не создавать кортеж)?

Я хочу отказаться от функции раньше, если приведены неподходящие аргументы. Обязательное решение в Javascript элегантно:

arg=>{
 if(arg>limit) return 42;
 //perform complex operations
 return x+y
}

ReasonML как функциональный язык не имеет return, поэтому я запихиваю все в одно выражение:

arg=>{
    let helper=()=>{
        //complex operations here
        ; x+y
    }
    (arg>limit) ? 42 : helper()
}

Теперь это работает, но вместо того, чтобы просто возвращать 42, я хочу вставить Js.Log("!CORNER CASE!"). Как я могу это сделать? На C я мог написать(arg>limit) ? (Js_Log("..."),42) : helper(), но в ReasonML это становится кортежем и не компилируется.

OCaml мог сделать begin printf "msg" ; 42 end, но точка с запятой у меня не работает в Reason: (Js.log("TEST");42) - не компилируется!

В качестве альтернативы мне нужен K-комбинатор в ReasonML.

1 ответ

Решение

Я не понимаю, что плохого в том, чтобы просто использовать

if (arg > limit) {
  Js_Log("...");
  42
} else {
  //complex operations here
  x + y
}

но если вам абсолютно необходимо втиснуться в тернарное условное выражение, вы можете использовать фигурные скобки для формирования блока кода и там, и, как правило, в любом месте вы можете поместить выражение:

arg > limit ? {Js.log("..."); 42} : helper()

Я обычно считаю это запахом кода, но для быстрой отладки это может быть полезно.

Другие вопросы по тегам