如何理解scala中的monad

St.*_*rio 6 monads scala higher-kinded-types

我只是理解了什么类型的构造函数和更高级的kinded类型状态,现在我正在尝试理解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

}
Run Code Online (Sandbox Code Playgroud)

问题是我不明白为什么Monad是更高的kinded类型?我们有标准的List[T],Option[T]单子不属于高kinded类型.

我不是理论类专家所以我将monad视为monads法则的容器.

为什么我们不按如下方式声明monad:

trait Monad[V]{
    //...
}
Run Code Online (Sandbox Code Playgroud)

不是更高的一种.

Option[T]在这种情况下,标准monad 如何看起来像一个子类?

Yuv*_*kov 6

我不明白为什么Monad是一个更高级的类型?

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

// Doesn't compile
trait Monad[V]{
  def pure[A](a: A): V[A]
}
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,因为我们不能V[A]为任意类型参数编写,它必须是一个类型构造函数,特别是一种类型* -> *

标准的Option [T] monad在这种情况下如何看起来像一个子类

关于作为类型构造函数的Monad(和Functor)的另一个问题是,我们创建了一个单独的表示Monad[List],例如,由于多态类型和免费的风格,它可以免费获取它的所有T参数List.再一次,你不能凭借签名Monad实现它没有类型构造函数.

我们有标准的List [T],Option [T] monad,它们不是更高级的类型.

那就对了.它们不是更高级的,因为T它本身不需要是任何操作List[T]Option[T]工作的类型构造函数,但T在这种意义上可以表示任何类型.这意味着虽然Option[T]是善良的* -> *,但我仍然可以用a List来构建它Option[List[T]].