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 如何看起来像一个子类?
我不明白为什么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]].