Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the name of |> in F# and what does it do?

Tags:

f#

A real F# noob question, but what is |> called and what does it do?

like image 756
Mark Pearl Avatar asked Apr 13 '10 15:04

Mark Pearl


2 Answers

It's called the forward pipe operator. It pipes the result of one function to another.

The Forward pipe operator is simply defined as:

let (|>) x f = f x

And has a type signature:

'a -> ('a -> 'b) -> 'b

Which resolves to: given a generic type 'a, and a function which takes an 'a and returns a 'b, then return the application of the function on the input.

You can read more detail about how it works in an article here.

like image 82
LBushkin Avatar answered Sep 29 '22 15:09

LBushkin


I usually refer to |> as the pipelining operator, but I'm not sure whether the official name is pipe operator or pipelining operator (though it probably doesn't really matter as the names are similar enough to avoid confusion :-)).

@LBushkin already gave a great answer, so I'll just add a couple of observations that may be also interesting. Obviously, the pipelining operator got it's name because it can be used for creating a pipeline that processes some data in several steps. The typical use is when working with lists:

[0 .. 10] 
  |> List.filter (fun n -> n % 3 = 0) // Get numbers divisible by three
  |> List.map (fun n -> n * n)        // Calculate squared of such numbers

This gives the result [0; 9; 36; 81]. Also, the operator is left-associative which means that the expression input |> f |> g is interpreted as (input |> f) |> g, which makes it possible to sequence multiple operations using |>.

Finally, I find it quite interesting that pipelining operaor in many cases corresponds to method chaining from object-oriented langauges. For example, the previous list processing example would look like this in C#:

Enumerable.Range(0, 10) 
  .Where(n => n % 3 == 0)    // Get numbers divisible by three
  .Select(n => n * n)        // Calculate squared of such numbers

This may give you some idea about when the operator can be used if you're comming fromt the object-oriented background (although it is used in many other situations in F#).

like image 35
Tomas Petricek Avatar answered Sep 29 '22 16:09

Tomas Petricek