Как создать последовательность действий в середине выражения в 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()
Я обычно считаю это запахом кода, но для быстрой отладки это может быть полезно.