如何理解scala中的monad

How to understand monad in scala

我刚刚了解了类型构造函数和更高级类型的状态,现在我正在尝试了解 Monad。这是 Monad 特征在 scalaz 中的样子:

trait Monad[F[_]] extends Applicative[F] with Bind[F] { self =>
  ////

  override def map[A,B](fa: F[A])(f: A => B) = bind(fa)(a => point(f(a)))
  //The rest is omitted

}

问题是我不太明白为什么 Monad 是更高级的类型?我们有标准的 List[T]Option[T] 单子,它们不是更高种类的类型。

我不是理论类别专家,所以我将 monad 视为具有 monad 法则的容器。

为什么我们不直接声明一个 monad 如下:

trait Monad[V]{
    //...
}

不是更高一类。

标准 Option[T] monad 在那种情况下作为一个子类会是什么样子?

I don't kind of understand why Monad is a higher kinded type?

我认为了解为什么它必须是更高种类类型的最快方法是尝试为 pure 创建一个签名,其中类型参数本身不是类型构造函数:

// Doesn't compile
trait Monad[V]{
  def pure[A](a: A): V[A]
}

当然,那是行不通的,因为我们不能为任意类型参数编写 V[A],它必须是类型构造函数,尤其是 * -> *

How would standard Option[T] monad look like in that case as a subclass for instance

关于 Monad(以及与此相关的 Functor)作为类型构造函数的另一件事是,我们创建 Monad[List] 的单一表示,例如,并免费为所有 T 的参数 List 因为多态类型和定理是免费的。同样,您不能凭借 Monad 的签名在没有类型构造函数的情况下实现它。

We have standard List[T], Option[T] monads which are not higher kinded types.

没错。它们不是更高种类的,因为 T 本身不需要成为 List[T]Option[T] 的任何操作的类型构造函数,但 T 在这个意义上可以表示任何类型。这意味着尽管 Option[T] 属于 * -> *,我仍然可以用 List 构造它来生成 Option[List[T]].