将第一个多个变量插入函数

时间:2019-04-22 11:03:14

标签: reason bucklescript

我在BuckleScript中有代码:

let add = (x, y) => x+y;
2 -> (3 -> add);

我希望它可以出于明显的原因进行编译。但事实并非如此。我得到

'|.' is not a valid value identifier.

为什么?干杯。

3 个答案:

答案 0 :(得分:4)

这是一个错误,刚刚进行了初步修复!

答案 1 :(得分:1)

我不知道为什么会特别出现此错误,但是因为语法转换而不是普通运算符,但是我怀疑BuckleScript可能不会递归检查|.而是将其传递给确定无论是什么意思,它都是无效的“值标识符”。

但是无论如何,我看不出它在实践中如何工作。它与|>一起很好地工作,因为这是依赖于curring的普通运算符。 |>的每个应用程序都会“附加”一个参数,由于currying返回一个实际值,即最终值或部分应用的函数,例如:

3 |> add  <=>  add(3)  <=>  y => add(3, y)

|.的部分申请将返回什么?反之亦然。唯一的可能性是返回一个应用最后一个参数的显式函数,例如x => add(x, 3),但这需要了解函数的泛型,因此不再仅仅是语法转换。

在我看来,

|.是一种讨厌的hack,虽然不自然地适合该语言,但是无论如何它还是被迫插入BuckleScript中,尽管它存在缺陷和严重的负面影响,但似乎仍鼓励使用它。我的建议是(照常)避免这种情况。在Reason中,您可以在需要时使用|> _代替,例如3 |> add(_, 2) <=> 3 -> add(2)

答案 2 :(得分:0)

仅当使用BuckleScript将Reason编译为JavaScript时,pipe first运算符才可用(有关BuckleScript站点中的管道优先,请参见docs)。

如果您正在处理本机Reason项目(或通过js_of_ocaml在浏览器中使用本机编译器的项目,例如sketch.sh),则管道运算符将不可用。

错误消息显示|.的原因是因为管道运算符在Reason语法中写为->在OCaml语法中写为|.

有关更多详细信息,请参见What's the difference between -> and |> in reasonml?