Saying x |> f is exactly the same as f x, just a bit longer.
It is called the "pipe" operator because it lets you write "pipelined" code.
It can make nested function calls more readable.
For example, say we have a sanitize function for turning user input into integers:
  (* Before *)
  let sanitize (input: string) : int option =
    Int.from_string (String.trim input)
We can rewrite it like this:
  (* After *)
  let sanitize (input: string) : int option =
    input
    |> String.trim
    |> Int.from_string
This can be overused! When you have three or four steps, the code often gets clearer if you break things out into some smaller piplines assigned to variables. Now the transformation has a name, maybe it could have a type annotation.
It can often be more self-documenting that way!