title: Why would validation break the monad laws?
body: <p>On <a href="https://stackoverflow.com/questions/12211776/why-isnt-validation-a-monad-scalaz7#12212283">SO</a> an explanation is given why a Validation like in scalaz, cats (Scala), or Arrow (Kotlin) can't be a monad. </p>
  
  <p>As far as I understand it's because they've modelled monads in terms of applicative functors and the desired behaviour of a Validation as applicative (gathering all invalids) is different from the desired behaviour of a Validation as monad (sequence validations and fail fast on the first invalid). As a result you need to convert a validation into an either (which is a monad) when you want the fail fast. </p>
  
  <p>On <a href="https://groups.google.com/forum/#!msg/scalaz/IWuHC0nlVws/syRUkXJklWIJ" rel="noreferrer">https://groups.google.com/forum/#!msg/scalaz/IWuHC0nlVws/syRUkXJklWIJ</a>, they mention the reason validation is not a monad, is because the following property would not hold:</p>
  
  <pre><code>x &lt;|*|&gt; y === x &gt;&gt;= (a =&gt; y map ((a, _))) 
  </code></pre>
  
  <p>But looking at the definition of a monad, the property above is not part of the <a href="https://wiki.haskell.org/Monad_laws" rel="noreferrer">monad laws</a>. So, is this a result of the fact that monads are implemented in terms of applicatives, or is the above property a prerequisite for being a monad?</p>
  
  <p>This higher kind reasoning is all quit new to me, but in my limited understanding of FP, I could have a validation data type that has one kind of behaviour when used as an applicative (accumulating invalids) and another behaviour when used as a monad (failing fast).</p>