在ReasonML中进行管道最后处理后,使用快速管道运算符编译错误

时间:2019-03-02 10:37:17

标签: syntax reason bucklescript pipe-operator

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。有什么作用?

2 个答案:

答案 0 :(得分:4)

看起来他们搞砸了->的优先级,因此实际上将其解释为

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的语法在计算方面有些混乱:

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

->代替|.是可行的。就像用|>取代|.一样。

我认为这是Rational中的一个错误,但是无论如何都建议不要使用“快速管道”,因为它会带来很多混乱,而带来的好处却很小。

答案 1 :(得分:1)

另请参见此discussion on Github,其中包含各种解决方法。将@glennsl保留为可接受的答案,因为它描述了问题的性质。