【问题标题】:How do you call an uncurried function with unit in ReScript/ReasonML?如何在 ReScript/ReasonML 中使用单位调用 uncurried 函数?
【发布时间】:2021-02-19 02:21:30
【问题描述】:

假设我有一个 uncurried 函数,例如:

let echo(. a) = a;

我可以用大多数文字来调用这个函数,比如:

echo(. 1)
echo(. "Hello")

但是当我尝试用 void 调用它时,我得到一个错误:

echo(. ()) //This function has arity1 but was expected arity0

作为一种解决方法,我可以这样做:

let myArg = ()
echo(. myArg)

有没有办法避免这种情况?

【问题讨论】:

  • 不——这是推荐的方式。
  • 嗨@Yawar,这是在哪里推荐的?

标签: reason bucklescript rescript


【解决方案1】:

我也喜欢这个版本:

echo(. ignore())

这样我就不需要虚拟值解决方法

编辑:这个版本现在也是文档的一部分:https://rescript-lang.org/docs/manual/latest/function#uncurried-function

【讨论】:

    【解决方案2】:

    看起来您正在尝试调用一个非 curried 函数,该函数接受一个不带参数的参数,因为这就是 () 的正确含义。它适用的唯一原因 echo(. myArg) 在这种情况下,编译器正在声明一个未初始化的变量 myArg 并将其传递给 echo。 编辑:你可以看看我的意思re-script playground here

    let echo = (. a) => a;
    
    
    let k =() => echo(. "String")
    let myArg = ()
    let s =() => echo (. myArg)
    

    生成

    // Generated by ReScript, PLEASE EDIT WITH CARE
    'use strict';
    
    
    function echo(a) {
      return a;
    }
    
    function k(param) {
      return echo("String");
    }
    
    function s(param) {
      return echo(undefined);
    }
    
    var myArg;
    
    exports.echo = echo;
    exports.k = k;
    exports.myArg = myArg;
    exports.s = s;
    /* No side effect */
    
    

    【讨论】:

    • 我不认为使用单位调用函数与调用不带参数的函数相同:()unit 类型的唯一文字,我希望 () 能够是签名为'a -> 'a 的函数的有效参数。例如,在 OCaml 中,我可以编写以下任一函数:let f a = alet g(a) = a,我可以使用 () 文字来调用它们。这两个函数都将返回unit。事实上,即使在脚本中,我也可以定义一个函数 let f (a) => a;f(()) 将返回一个单位。问题是为什么我不能做同样的事情,当函数是 uncurried 时
    【解决方案3】:

    显然,这是 rescript 中的一个已知问题。见:https://github.com/rescript-lang/rescript-compiler/issues/3429

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多