如何理解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]]
.
我刚刚了解了类型构造函数和更高级类型的状态,现在我正在尝试了解 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]]
.