Ошибка компиляции с использованием оператора быстрого канала после последнего канала в ReasonML - PullRequest
0 голосов
/ 02 марта 2019

То, как оператор «быстрой трубы» сравнивается с «последней трубой» в многих местах , подразумевает, что они являются взаимозаменяемыми заменами друг друга.Хотите отправить значение в качестве последнего параметра функции?Используйте последнюю трубу (|>).Хотите отправить это как первый параметр?Используйте fast pipe (когда-то давно |., сейчас не рекомендуется в пользу ->).

Так что вы, как и раньше, до сегодняшнего дня, простите, что следующий код получитвы первое совпадение из совпадения с регулярным выражением:

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

См. эту песочницу .Что дает?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Также см. Это обсуждение Github , которое содержит различные обходные пути.Оставив @ glennsl в качестве принятого ответа, потому что он описывает природу проблемы.

Обновление: есть также статья на Medium , в которой много говорится о плюсах и минусах«данные в первую очередь» и «данные в последнюю очередь», в частности, это относится к Ocaml / Reason с Bucklescript.

0 голосов
/ 02 марта 2019

Похоже, что они испортили приоритет ->, так что он на самом деле интерпретируется как

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"));

Замена -> на |. работает.Как и замена |> на |..

, я бы посчитал это ошибкой в ​​Reason, но в любом случае рекомендовал бы вообще не использовать «fast pipe», так как это вызывает много путаницы дляочень мало пользы.

...