【问题标题】:Is Scala Either really a MonadScala是否真的是Monad
【发布时间】:2014-11-24 09:02:25
【问题描述】:

我想知道 scala Either 是否真的是类别理论意义上的 Monad?我知道 Monads 应该有 bindreturn 方法。那么Eitherbind是什么?

【问题讨论】:

  • scabl.blogspot.com/2013/02/monads-in-scala-1.html: 绑定操作,作为 Scala 函数,将具有以下签名: def bind[A, B](Maybe[A])(A => Maybe[B]): Maybe[B]
  • 我认为 Scala 中的 Haskell Maybe 更像是 Option 而不是 EitherEither 是类型的副产品。
  • 阅读文章。它解决了这个问题。

标签: scala monads either


【解决方案1】:

是的,确实如此 - 否则它将在 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)
  }
}

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

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

但它确实是Monad;它满足所有单子定律。

【讨论】:

  • 所以更准确地说RightLeftMonads,而Either本身不是,而是它的子类?
  • 不,那是错误的。 Left 本身根本不是 Monad,而 Right 本身只是身份 Monad。如果你想准确一点,Monad 并不是一个真正的特征(毕竟它不是一个数学概念),而是一个集合和一对操作。所以它更像是“对于任何A,所有Either[A, B] 的集合在bind=...point=... 操作下形成一个monad。
  • 从 Scala 2.12 开始,Either 变得偏右。所以从技术上讲,Either 在根上变得与其他 Monad 实现更加一致(因为不必选择一个投影来进一步执行 Monad 操作)。
  • @Imm @goral 可以为Left 定义一个Monad 实例(尽管它可能看起来很像IdId 中的Monad 实例@ ) 所以说左“是”Monad 是不正确的。但可以肯定的是,可以为Either 定义Monad 的实例(通常是这样做的),所以说Either 不是Monad 是不正确的。
猜你喜欢
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多