在Scala中什么使Option成为monad?

我知道单子是什么,以及如何使用它们。我不明白是什么让我们说,选项monad?

在Haskell中,monad Maybe是一个monad,因为它是从Monad类(它至少有2个必要的函数返回和绑定,使Monad类,实际上是一个monad)实例化。

但是在Scala中我们有:

sealed abstract class Option[+A] extends Product with Serializable { ... }
trait Product extends Any with Equals { ... }

没有什么与monad相关。

如果我在Scala中创建自己的类,它将是一个monad默认情况下?为什么不?

Monad是一个概念,一个抽象接口,如果你愿意,只是定义一种组成数据的方式。

选项支持通过flatMap组合,这几乎是需要穿戴“monad徽章”的一切。

从理论的角度来看,它还应该:

>支持一个单位操作(返回,在Haskell术语)从一个裸值创建一个monad,这在Option的情况下是Some构造函数
>尊重monadic laws

但这不是由Scala严格执行。

Scala中的Monads是一个更宽松的概念,在Haskell中,这种方法更实用。
从语言的角度来看,monad唯一与之相关的是在for-comprehension中使用的能力。

flatMap是一个基本要求,您可以选择提供map,withFilter和foreach。

然而,没有严格遵守Monad类型类的事情,就像在Haskell中一样。

这里有一个例子:让我们定义我们自己的monad。

class MyMonad[A](value: A) {
  def map[B](f: A => B) = new MyMonad(f(value))
  def flatMap[B](f: A => MyMonad[B]) = f(value)
  override def toString = value.toString
}

正如你所看到的,我们只是实现了map和flatMap(以及toString作为商品)。
恭喜,我们有一个monad!让我们试试:

scala> for {
  a <- new MyMonad(2)
  b <- new MyMonad(3)
} yield a + b
// res1: MyMonad[Int] = 5

尼斯!我们没有做任何过滤,所以我们不需要实现withFilter。也因为我们正在产生一个值,我们也不需要foreach。基本上你实现任何你想支持,没有严格的要求。如果你试图在一个for-comprehension过滤,并且你没有实现withfilter,你会得到一个编译时错误。

http://stackoverflow.com/questions/25361203/what-exactly-makes-option-a-monad-in-scala

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在Scala中什么使Option成为monad?