Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What F# sorcery is this (>=>)?

Tags:

f#

The below code snippet came from here and from the context I understand what it is doing via pattern matching, but how it is doing it and that operator(s) has me for a loop. MSDN was not helpful. If that is an operator, does it have a name? Sorry if there is some missing google fu on my part.

let (>=>) f1 f2 arg =   match f1 arg with   | Ok data -> f2 data   | Error e -> Error e 

UPDATE: Indeed it might be the case that the operator is overloaded, and thanks for the link to the other SO question, I guess the core of my question was what is that overloaded operator's semantics. Looking at the other links (>>=) seems to be the typical bind operator.

like image 667
Ahmad Ragab Avatar asked May 07 '15 20:05

Ahmad Ragab


1 Answers

That's the Kleisli composition operator for monads. It allows you to compose functions with signatures like 'a -> M<'b> and 'b -> M<'c'> where M is monadic: in your case the Result<'t> from the linked article.

>=> is really just a function composition, but >> wouldn't work here since the return type of the first function isn't the argument of the second one - it is wrapped in a Result<'t> and needs to be unwrapped, which is exactly what >=> implementation does.


It could be defined in terms of >>= as well:

let (>=>) f1 f2 arg =     f1 arg >>= f2 

It seems that Haskell's Control.Monad package uses this definition. The full type signature might also be helpful (taken from here):

-- | Left-to-right Kleisli composition of monads. (>=>)       :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c) f >=> g     = \x -> f x >>= g 

Yet another fun fact is that Kleisli composition makes the three monad laws easier to express by only using functions (and in my opinion it makes them much clearer):

  • Left identity: return >=> g ≡ g
  • Right identity: f >=> return ≡ f
  • Associativity: (f >=> g) >=> h ≡ f >=> (g >=> h)
like image 194
Honza Brestan Avatar answered Sep 30 '22 09:09

Honza Brestan