Infix operators in F#

F# makes the distinction between “prefix” and “infix” functions. The word prefix means that something comes before something else. Prepositions in many Indo-European languages, like “in”, “for” and “on” in English are examples of prefixes, they are placed in front of another word, most often a noun: in the house, at the station, for that purpose.

Prefix functions are how we most often define and call functions in F#. The function name comes first which is then followed by the function arguments.

Here’s a function that adds two numbers:

let addTwoNumbers x y = x + y

Unsurprisingly we call the above function as follows:

addTwoNumbers 3 5

The word “infix” on the other hand means something like “in between”. Infix functions in F#, also called infix operators, operate on two parameters and are placed in between those two parameters. All mathematical operators like +, -, / and * are examples of infix operators: 3 + 5, 10 / 2 etc. They are placed in between the two input parameters.

Infix operators can be applied in a prefix way. They must come before the parameters and must be put within parentheses:

let res = (/) 10 5

res will be 2 since that prefix expression is equal to 10 / 5 in an infix way.

We can also build our own infix operators. Their name can only consist of symbols and must be surrounded by parentheses when declared. Consider the following function that takes parameters and adds their squares:

let calc x y = x ** 2. + y ** 2.

Calling this function with 2 and 3…:

let res = calc 2. 3.

…gives 13. 2 ^ 2 = 4, 3 ^ 2 = 9, so 9 + 4 = 13.

We can define the calc function as an infix but me must only use symbols for its name. Note that the symbols are put between parentheses:

let (^||^) x y = x ** 2. + y ** 2.

We can now apply our infix operator:

let res = 2. ^||^ 3.

…which also gives 13. We can also chain our infix operators where the result of the first operation is applied to the second and then to the third and so on:

let res = 2. ^||^ 3. ^||^ 4. ^||^ 5.

…which yields 2856104.

View all F# related articles here.


About Andras Nemes
I'm a .NET/Java developer living and working in Stockholm, Sweden.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


A great site

iReadable { }

.NET Tips & Tricks

Robin Sedlaczek's Blog

Developer on Microsoft Technologies

HarsH ReaLiTy

A Good Blog is Hard to Find

Ricos Blog zu Softwaredesign- und architektur

Ideen und Gedanken rund um Softwaredesign und -architektur, Domain-Driven Design, C# und Windows Azure

the software architecture

thoughts, ideas, diagrams,enterprise code, design pattern , solution designs

Technology Talks

on Microsoft technologies, Web, Android and others

Software Engineering

Web development

Disparate Opinions

Various tidbits

chsakell's Blog

Anything around ASP.NET MVC,WEB API, WCF, Entity Framework & AngularJS

Cyber Matters

Bite-size insight on Cyber Security for the not too technical.

Guru N Guns's

OneSolution To dOTnET.

Johnny Zraiby

Measuring programming progress by lines of code is like measuring aircraft building progress by weight.

%d bloggers like this: