title: Haskell Monad bind operator confusion
body: <p>Okay, so I am not a Haskell programmer, but I am absolutely intrigued by a lot of the ideas behind Haskell and am looking into learning it. But I'm stuck at square one: I can't seem to wrap my head around Monads, which seem to be fairly fundamental. I know there are a million questions on SO asking to explain Monads, so I'm going to be a little more specific about what's bugging me: </p>
  
  <p>I read this excellent article (<a href="http://blog.jcoglan.com/2011/03/05/translation-from-haskell-to-javascript-of-selected-portions-of-the-best-introduction-to-monads-ive-ever-read/">an introduction in Javascript</a>), and thought that I understood Monads completely. Then I read the Wikipedia entry on Monads, and saw this:</p>
  
  <blockquote>
    <p>A binding operation of polymorphic type (M t)→(t→M u)→(M u), which Haskell represents by the infix operator >>=. <strong>Its first argument is a value in a monadic type, its second argument is a function that maps from the underlying type of the first argument to another monadic type, and its result is in that other monadic type.</strong></p>
  </blockquote>
  
  <p>Okay, in the article that I cited, bind was a function which took <em>only one</em> argument. Wikipedia says two. What I <em>thought</em> I understood about Monads was the following:</p>
  
  <ol>
  <li>A Monad's purpose is to take a function with different input and output types and to make it composable. It does this by wrapping the input and output types with a single monadic type.</li>
  <li>A Monad consists of two interrelated functions: bind and unit. Bind takes a non-composable function f and returns a new function g that accepts the monadic type as input and returns the monadic type. g is composable. The unit function takes an argument of the type that f expected, and wraps it in the monadic type. This can then be passed to g, or to any composition of functions like g.</li>
  </ol>
  
  <p>But there must be something wrong, because my concept of bind takes one argument: a function. But (according to Wikipedia) Haskell's bind actually takes <em>two</em> arguments! Where is my mistake?</p>