Pipe Last
We discourage the usage of the |> / pipe-last operator in BuckleScript codebases. Using it may sometimes have a runtime cost due to currying.
Please use the pipe-first operator instead.
Pipe-last is mainly used in native / OCaml codebases or in functional programming libraries
aiming for a data last approach. You'll also find it in older Reason codebases and libraries.
|> is an infix operator for piping a value to the last argument position of a function.
Example:
RElet personSays = (person, msg) => person ++ " says: " ++ msg;
"This will be put in the msg arg"
|> personSays("Alpaca");
/* Returns: "Alpaca says: This will be put in the msg arg */
Differences between pipe-last and pipe-first
Pipe-last is a binding to a compiler intrinsic, it will optimize some currying, but not all. Pipe-first (
->) is implemented as syntactic sugar within BuckleScript and guarantees zero extra currying overhead.Pipe-last can't pipe into a variant constructor (see
1->Some)
For a more thorough discussion on the rationale and differences between the two operators, please refer to the Data-first and Data-last comparison by Javier Chávarri
Note on Precedence
Mixing both pipe operators might lead to confusion, since the pipe-first operator has a higher precedence. For example:
RElet maybeGreeting = Some("hello");
maybeGreeting |> Belt.Option.isSome -> Js.log;
will not compile, since the compiler will process the -> first (Belt.Option.isSome -> Js.log)
before applying maybeGreeting to Belt.Option.isSome. A fix for the example above would involve
using parenthesis, like this:
RElet maybeGreeting = Some("hello");
(maybeGreeting |> Belt.Option.isSome) -> Js.log;