syntax - 在 ReasonML 中的最后一个管道之后使用快速管道运算符编译错误

标签 syntax reason bucklescript

many 中“快速管道”运算符与“最后管道”的比较方式places暗示它们是彼此的直接替代品。想要将一个值作为函数的最后一个参数发送?最后使用管道 (|>)。想把它作为第一个参数发送?使用快速管道(曾几何时 |.,现在已弃用,取而代之的是 ->)。

因此,您可能会像我直到今天早些时候那样认为以下代码会为您提供正则表达式匹配中的第一个匹配项:

Js.String.match([%re "/(\\w+:)*(\\w+)/i"], "int:id")
|> Belt.Option.getExn
-> Array.get(1)

但你错了(再一次,就像我今天早些时候......)

相反,编译器发出以下警告:

We've found a bug for you!
OCaml preview 3:10-27
This has type:
  'a option -> 'a
But somewhere wanted:
  'b array

参见 this sandbox .给了什么?

最佳答案

看起来他们搞砸了 -> 的优先级,所以它实际上被解释为

Js.String.match([%re "/(\\w+:)*(\\w+)/i"], "int:id")
|> (Belt.Option.getExn->Array.get(1));

内联运算符:

Array.get(Belt.Option.getExn, 1, Js.String.match([%re "/(\\w+:)*(\\w+)/i"], "int:id"));

或者更明确地使用部分应用程序,因为 Reason 的语法在柯里化(Currying)方面有点困惑:

let f = Array.get(Belt.Option.getExn, 1);
f(Js.String.match([%re "/(\\w+:)*(\\w+)/i"], "int:id"));

-> 替换为 |. 有效。将 |> 替换为 |. 也是如此。

我认为这是 Reason 中的一个错误,但在任何情况下我都建议不要使用“快速管道”,因为它会带来很多困惑而收效甚微。

关于syntax - 在 ReasonML 中的最后一个管道之后使用快速管道运算符编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54957566/

相关文章:

compiler-errors - 未使用属性 'explicit_arity'

ocaml - 带有可选和可变字段的记录

c - c中函数的语法错误

bash - Bash 中的动态变量名称

php - Code-Golf:一行 PHP 语法

ocaml - Reasonml中的->和|>有什么区别?

python - 当尝试在任何地方定义全局变量时,我得到 'invalid syntax'

javascript - ReasonML javascript 记录字段

json - 将 JSON 字段转换为 ReasonML 变体