Scala 是否真的是一个 Monad

gor*_*ral 5 monads scala either

我想知道 ScalaEither是否真的是Monad范畴论意义上的?我知道 Monads 应该有bindreturn方法。是什么Eitherbind呢?

lmm*_*lmm 5

是的,确实如此——否则它就会陷入scalaz-outlaws。Eitherbind定义如下:

trait Either[A, B] {
  def bind[C](f: B => Either[A, C]) = this match {
    case Right(b) => f(b)
    case Left(a) => Left(a)
  }
}
Run Code Online (Sandbox Code Playgroud)

(实际上它是通过类型类定义的,但上面的定义可以工作)

我想更恰当地说,对于一个 fixed A,类型({type L[B]=Either[A, B]})#L形成 a Monad,因此它本身Either更像是一个类而Monads不是 a Monad,但这是一个非常技术性的区别。

但它确实是一个Monad; 它满足所有的单子法则。