寻找应用Monad的某些但不是所有属性的结构的示例



什么是Monad的主题已经在几个stackoverflow问题以及其他形式中得到了广泛的讨论。尽管如此,我发现很少有关于什么是虚假的莫纳德的例子(我不知道是否有现成的术语,我有点编造了这个词(。所谓假Monad,我的意思是它满足一个或多个Monad属性,但NOT满足所有属性。

据我所知,Monads的性质可以概括为:

// 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))

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

更新:我的目标不是公开讨论什么是莫纳德。它在Scala中有一些代码示例,用于应用一些但不是所有Monad定律的结构。

如果有帮助的话,我在这篇关于Monad的文章中发现了一个例子,它指出非Monad可以是一个列表,其flatMap实现反向返回小列表的串联。我希望这能为帮助我澄清困惑所需的例子提供更好的方向。

用Java的术语来说:monad=flatMap+unit接口+monad-laws合同。

你总是可以摆脱法律/契约,但你只剩下一个没有任何保证的接口——在monad的情况下,这一点非常重要,因为契约基本上允许你将函数A => F[B]组合起来,就好像它们是数字一样(括号的顺序无关紧要,有一个0不会影响结果(。去掉任何一条定律,这个类比就会突然分崩离析。(有点像Java中的Cloneable接口,实现抛出NotImplementedException——这是一个接口的实现,但它相当无用(。因此,没有人会称它们为代数,接口是它们应得的最好名称。

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

如果你正在寻找比monad更弱的代数(但仍然是代数!(,那么有函子或应用函子。

最新更新