【问题标题】:Looking for examples for structures that apply some but not all properties of a Monad寻找适用于 Monad 的一些但不是所有属性的结构的示例
【发布时间】:2020-07-13 10:49:25
【问题描述】:

什么是 Monad 的主题已经在几个 stackoverflow 问题以及其他形式中得到了广泛的讨论。尽管如此,我发现很难找到什么是假 Monad 的例子(我不知道是否有一个现有的术语,我有点捏造了这个词)。假 Monad 是指它满足一个或多个 Monad 属性,但 满足所有属性。

据我了解,Monad 的属性可以概括为:

// 1. Monad(foo).flatMap(f) == f(foo)
// 2. Monad(bar).flatMap(f => f(bar)) == Monad(bar)
// 3. Monad(baz).flatMap(f).flatMap(g) == Monad(baz).flatMap(x => f(x).flatMap(g))

我正在寻找非单子结构的示例。理想情况下,Monad 的示例确实适用于 Monad 的一些但不是所有的法律。也欢迎进一步阅读。

更新: 我的目标不是公开讨论 Monad 不是什么。而是在 Scala 中提供适用于部分但不是全部 Monad 定律的结构的代码示例。

如果有帮助,我在 Monads 上的 article 中找到了一个示例,该示例指出非 Monad 可以是一个列表,其 flatMap 实现反向返回小列表的串联。我希望这可以为帮助消除我的困惑提供更好的示例方向。

【问题讨论】:

  • 这是一个非常奇怪的要求。例如,单子不是香蕉。如果你把香蕉压扁,你最多只能得到一些香蕉糊。它很好吃,但我不确定这在 Stack Overflow 环境中是否非常有用。
  • 不遵守所有一元法则的结构有无数种。 JavaScript Promises 例如。但我不认为 1. 我们可以对所有这些结构进行详尽的分类 2. 对它们进行分类有多大价值。
  • 一个无法无天或无原则的 monad 是一种类似 monad 的结构,它提供了必要的操作(pureflatmap),但其 flatmap 操作与值相冲突或不具有关联性或其pure 操作实际上执行了一个效果。 monad 必须只关心上下文,而不是上下文中的值。
  • 首先,如果您不知道如何flatten 它,某些结构将不是monad。例如,在叶子中具有值的二叉树是一个 monad,因为您可以通过在外部树的叶子中粘合内部树来扩展外部树的二叉树 flatten 二叉树。但是在所有节点中都有值的二叉树不是 monad,因为不清楚如何自然地展平二叉树的二叉树。
  • 其次,可能有一些我们知道如何flattenpure 但不满足一元法则的结构。这样的事情被称为非法实例。见github.com/non/alleycats

标签: scala functional-programming


【解决方案1】:

用 Java 的术语来说:一个 monad = 一个 flatMap+unit 接口 + 一个 monad-laws 契约。

你总是可以摆脱法律/合同,但是你只剩下一个没有任何保证的接口——在 monad 的情况下它非常重要,因为合同基本上让你组合函数 A => F[B] 就好像它们是数字(括号的顺序无关紧要,有一个 0 不影响结果)。拿走任何一条定律,这个类比突然就崩溃了。 (有点像 Java 中的 Cloneable 接口,其中实现抛出 NotImplementedException - 它是接口的实现,但它相当无用)。出于这个原因,没有人会称它们为代数,接口是他们应得的最佳名称。

TryFuture 作为这样的实现 - 它们有地图和平面地图,但不被认为是合法的。它们有用吗?是的。你能像对每个 monad 一样无脑地重构它们吗?不,因为你可以改变行为。在 Cats 中,这样的实现很可能会出现在 alleycats 库中。

如果您正在寻找不如 monad 强大的代数(但仍然是代数!),那么有函子或应用函子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2011-09-19
    • 2016-09-21
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多