假设我为Future
定义了一个Monad
类型类的实例:
val futureMonad = new Monad[Future] {
override def point[A](a: ⇒ A): Future[A] =
Future(a)
override def bind[A, B](fa: Future[A])(f: A => Future[B]): Future[B] =
fa flatMap f
}
严格来说,这不是一个单子(Monad),因为它违反了左恒等律:
futureMonad.point(a) bind f == f(a)
如果
f
抛出异常,左侧表达式的结果将是一个失败的Future
,而右侧当然会抛出异常。但这种违规行为有什么实际影响?系统可能会因此失败的方式有哪些?