【发布时间】: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 的结构,它提供了必要的操作(
pure、flatmap),但其flatmap操作与值相冲突或不具有关联性或其pure操作实际上执行了一个效果。 monad 必须只关心上下文,而不是上下文中的值。 -
首先,如果您不知道如何
flatten它,某些结构将不是monad。例如,在叶子中具有值的二叉树是一个 monad,因为您可以通过在外部树的叶子中粘合内部树来扩展外部树的二叉树flatten二叉树。但是在所有节点中都有值的二叉树不是 monad,因为不清楚如何自然地展平二叉树的二叉树。 -
其次,可能有一些我们知道如何
flatten和pure但不满足一元法则的结构。这样的事情被称为非法实例。见github.com/non/alleycats
标签: scala functional-programming