【发布时间】:2018-03-10 00:03:42
【问题描述】:
我刚刚了解类型构造函数和更高种类的类型状态,现在我正在尝试了解 Monad。这是Monad trait 在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 法则的容器。
我们为什么不直接声明一个 monad 如下:
trait Monad[V]{
//...
}
不是更高的种类。
例如,在这种情况下,标准 Option[T] monad 作为子类会是什么样子?
【问题讨论】:
-
简而言之,假设 monad 只是另一种模式,它统一了 scala 集合库下的数据操作。
-
@Pavel 好的,但为什么它是更高种类的类型?
-
他们有时会说“单子就像墨西哥卷饼”:)
-
一个monad由一个类型构造函数(例如
Option、List等)和函数pure和bind/join组成。 monad trait 需要有更高的种类来抽象类型构造函数。
标签: scala monads higher-kinded-types