Syntax 在ReasonML中最后一个管道之后使用快速管道操作符编译错误

Syntax 在ReasonML中最后一个管道之后使用快速管道操作符编译错误,syntax,reason,bucklescript,Syntax,Reason,Bucklescript,“fast pipe”操作符与中的“pipe last”进行比较的方式意味着它们是彼此的替代品。是否要将值作为最后一个参数发送到函数?最后使用管道(|>)。要将其作为第一个参数发送吗?使用快速管道(以前是|.,现在不推荐使用->) 因此,您可以原谅我的想法,就像我今天早些时候所做的那样,下面的代码将使您从正则表达式匹配中获得第一个匹配: Js.String.match([%re/(\\w+:)*(\\w+/i“],“int:id”) |>Belt.Option.getExn ->数组。get(1

“fast pipe”操作符与中的“pipe last”进行比较的方式意味着它们是彼此的替代品。是否要将值作为最后一个参数发送到函数?最后使用管道(
|>
)。要将其作为第一个参数发送吗?使用快速管道(以前是
|.
,现在不推荐使用
->

因此,您可以原谅我的想法,就像我今天早些时候所做的那样,下面的代码将使您从正则表达式匹配中获得第一个匹配:

Js.String.match([%re/(\\w+:)*(\\w+/i“],“int:id”)
|>Belt.Option.getExn
->数组。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

看。给出了什么?

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

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”);
|替换
->
有效。将
|>
替换为
|.
也是如此

我认为这是一个错误的原因,但无论如何都不建议使用“快速管道”,因为它引起了很多混乱,几乎没有什么好处。

也看到了,这包含了各种各样的解决办法。将@glennsl作为公认的答案,因为它描述了问题的性质


更新:关于“数据优先”和“数据最后”的利弊,也有很多深入的讨论,特别是它适用于Ocaml/Reason with Bucklescript。

谢谢!你的答案很有帮助(你的食谱也是如此)。回购问题追踪者中似乎有不少人提到这一点。建议对帕伦夫妇的使用有点过于宽松,不符合我的喜好。对于避免首先使用管道的编码样式,您有什么建议?在定位时使用比萨饼管?或者只是使用中间的
绑定并接受命令式的感觉?(我意识到这是一个意见问题,因此在评论中询问!只是对你的个人偏好感兴趣。)
|>\uu我认为可以可靠地替代快速管道,但我会尝试完全避免“t优先”功能,这意味着放弃传送带。使用t first设计的函数也不能很好地与部分应用程序配合使用,而部分应用程序是有效的函数组合以及语言功能的重要组成部分。似乎Reason正试图推动不强调底层语言功能性质的约定,而支持JavaScript中的习惯用法。但是,由于编译器附带的生态系统甚至大部分功能都是基于旧的约定,因此它最终会变得非常混乱。人们似乎对解决甚至承认这些问题兴趣不大。皮带和快速管道在一年多前推出,承诺会解释一切,但此后很少有人提及。但通过
\uuu
定位,您肯定可以实现人们可能希望的部分应用程序?当然,还有额外的标点符号和心理开销的代价。我确实发现了API令人困惑的原因。他们似乎有过多的做事方式(如制作地图的最佳方式)。这本身是不可取的,但人们也必须明智地选择,因为有很多陷阱。一旦你开始构建代码,缺乏超越入门级的官方文档就真的很伤脑筋。希望我的公司能够接受,并准备赞助一些时间来提供文档/教程。