【问题标题】:How to create a sequence of actions mid-expression in ReasonML (and avoid creating a tuple)?如何在 ReasonML 中创建一系列动作中间表达式(并避免创建元组)?
【发布时间】:2020-04-06 02:08:10
【问题描述】:

如果给定不合适的参数,我想尽早退出函数 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,但分号在原因中对我不起作用:(Js.log("TEST");42) -- 无法编译!

或者,我需要 ReasonML 中的 K-combinator。

【问题讨论】:

    标签: control-flow reason k-combinator


    【解决方案1】:

    我看不出只是使用有什么问题

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

    但如果你绝对必须挤进三元条件,你也可以使用花括号在那里形成一个代码块,通常在任何你可以放置表达式的地方:

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

    虽然我通常认为这是一种代码异味,但为了快速调试,它会很方便。

    【讨论】:

    • 对我来说,if 版本很臭,因为缩进是移动的。复杂的操作是稳定的代码,不应该因为更容易改变的进入条件而移动。但是,感谢您的支持,我一定是在计算括号时迷失了方向,因为 {a;b} 没有编译,我不确定它是否是有效的语法。现在我知道它是,我将它按摩到工作状态。实际的行是:(ip>=max)? (ip>max+dmax)?0:{Js.log({j|ISPMAX=$ispmax!!!!!!!!!!!!!!!!!!|j});ispmax}:( min>ip)?0:helper()
    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2013-07-05
    • 2021-09-24
    • 2017-03-26
    • 2021-12-05
    相关资源
    最近更新 更多