Violation of the left identity law for Future monads in scalaz

前端 未结 2 2086
逝去的感伤
逝去的感伤 2021-02-15 11:01

Suppose I define an instance of the Monad typeclass for Future:

val futureMonad = new Monad[Future] {
  override def point[A](a: ⇒ A):          


        
相关标签:
2条回答
  • 2021-02-15 11:57

    Monads such as Try and Future trade one monad law for another law which is more useful in the context they are supposed to be used: An expression composed from (Try or Future), flatMap, map will never throw a non-fatal exception. Call this the "bullet-proof" principle. So actually this approach really protects you against many failures and left-unit law is failed deliberately.

    0 讨论(0)
  • 2021-02-15 12:00

    It just means, in terms of for comprehensions, that the following refactoring is not semantics-preserving:

    for (fut <- Future(a); x <- f(fut)) yield x  ==>  f(a)
    

    But that's just another way of writing the left identity law, really.

    To explain that invalid refactoring further:

    for (fut <- Future(a); x <- f(fut)) yield x
    ==>  for (x <- f(a)) yield x  // by left identity law: WRONG, because left identity law does not hold
    ==>  f(a)                     // by 1st functor law:   WRONG, because previous line was wrong
    
    0 讨论(0)
提交回复
热议问题