gpt4 book ai didi

scala - List 是怎样的一个单子(monad)?

转载 作者:行者123 更新时间:2023-12-03 16:40:34 25 4
gpt4 key购买 nike

我想我对 Monads 和 monadic 操作有基本的了解,但仍然有点坚持理解 monadic 类型的魔法特性是如何添加到底层类型中的(希望这是有道理的)。

例如,我 was reading关于如何 List[T]是一个单子(monad)。但是如果我 flatMapmapfor 中按顺序遍历一些列表那么理解是不是真的flatMapmap提供一元魔法?

如果我创建一个 List<String>那么一元魔法是如何添加的呢?或者是 List<T>在 Scala 中总是一个单子(monad),因为它恰好是该语言已经为其提供内置单子(monad)支持的容器之一?

最佳答案

你说得对flatMapmap正在提供“一元魔法”。幸运或不幸(取决于你见过多少糟糕的代码)在编程中没有魔法。再多的抽象也无法使您(或其他人)免于最终编写执行您想要的事情的代码。抽象“只是”让您可以重用以前编写的代码并澄清您对问题的想法。那么一个单子(monad)只是一个概念、一个想法、一个抽象等等。

在 Scala 的情况下,这就是编译器对 for 所做的事情。理解,变成一系列flatMap , map , withFilter , 和 filter陈述。

一个 monad(在 Scala 中)可以被认为只是一个标签,你碰巧有一个类型构造函数 T[_]和两个功能1

def f0[A](x: T[A], f: X => T[A]): T[A]
def f1[A](x: A): T[A]

按照惯例,当他们看到这种现象时,Scala 社区会调用 f0 flatMap并且通常使它成为一种方法,以便 x始终是父类,而不是单独的参数。还有一个约定叫 f1 pointpure (见 scalazcats )。 f1通常也是一种方法,因此它最终不会显式地接受参数,而只是将其父类用作 x .

每当有人说“某某”是一个单子(monad)时,总会有一个隐含的 f0f1说话者希望听者推断出的。严格来说,“ List 是一个单子(monad)”是对术语的轻微滥用。它是 List 的简写连同函数 (xs: List[A], f: A => List[A]) => xs.map(f).flatten (形成 f0 )和 (x: A) => List(x) (形成 f1 )形成一个单子(monad)。或者稍微不那么钝, List连同标准 flatMap在列表和 List.apply构造函数形成一个单子(monad)。

因此,从来没有任何魔法。作为将某物分类为 Monad 的一部分您必须提供 flatMap 的概念和 pure .

有很多方法可以将这种 monad 的抽象化为代码。天真的方式(即没有第三方库的 Scala)只是同意 f0 的通用名称。和 f1 (例如 flatMap ),只需将具有适当类型签名的方法命名为这些名称。本质上就是 scalac期待您为 for 做理解。您可以更进一步,尝试使用 trait 将事情正式化。或 abstract class .也许叫它 Monad变得可爱并具有以下内容:
trait Monad[A] {
def flatMap(f: A => Monad[A]): Monad[A]

def pure(x: A): Monad[A]
}

然后你可以调用任何扩展这个 Monad 的东西。 monad 想法的一个实现(你可能会想像 class List[A] extends Monad[A] 之类的东西)。

由于各种实际原因,结果并不令人满意,因此您最终得到了看起来像的通常解决方案(挥手消除了许多其他复杂性)
trait Monad[F[_]] {
def flatMap[A](f: A => F[A]): F[A]

def pure[A](x: A): F[A]
}

implicit 实现s。

脚注:
  • 以及一些管理它们相互作用的法律/公约。这些定律存在的实际原因是为了让程序员的生活更加清醒,这样当有人告诉他们这些函数是“单子(monad)的”时,他们知道会发生什么。这些定律正是使推理诸如单子(monad)之类的结构如此有用的原因,但我不会在这里深入研究它们,因为它们在其他地方已得到充分解释。
  • 关于scala - List 是怎样的一个单子(monad)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35698485/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com