Как создать последовательность действий в середине выражения в ReasonML (и избежать создания кортежа)? - PullRequest
0 голосов
/ 05 апреля 2020

Я хочу выйти из функции раньше, если даны неподходящие аргументы. Императивное решение в 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 Ответ

1 голос
/ 05 апреля 2020

Я не вижу, что не так просто с использованием

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

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

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

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

...