【问题标题】:How to understand monad in scala如何理解scala中的monad
【发布时间】: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由一个类型构造函数(例如OptionList等)和函数purebind/join组成。 monad trait 需要有更高的种类来抽象类型构造函数。

标签: scala monads higher-kinded-types


【解决方案1】:

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

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

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

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

在这种情况下,标准 Option[T] monad 会是怎样的? 例如子类

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

我们有标准的 List[T]、Option[T] 单子,它们不是更高种类的 类型。

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

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 2018-05-06
    • 1970-01-01
    • 2016-06-16
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多