jQuery是一个单子吗

Posted

技术标签:

【中文标题】jQuery是一个单子吗【英文标题】:Is jQuery a monad 【发布时间】:2012-05-16 20:06:01 【问题描述】:

我在某处读到 jQuery 是 monad,this answer 表明 underscore.js 库中的链函数不是 monad(而是comonad)。和answer to this 相似,表明它是幺半群。

那么,jQuery 是 monad 吗?

【问题讨论】:

我不知道 jQuery,所以回答这个问题的能力有限,但是如果你以正确的方式看待它们 [1 ]:comonad.com/reader/2011/monads-from-comonads 你是在要求某人证明 jQuery API 的核心是 monad 法则吗? "Monad" 真正描述的是一种方法(和一种使用模式),而不是一种类型。 jQuery 有大量的方法,但没有一个(AFAICT)符合 monad 的定义。这是一件好事!如果 jQuery 基于一元链,它只会更加冗长和繁琐。 【参考方案1】:

大多数 API 不满足单子定律。 jQuery 是一个很大的API,所以从统计学上来说,它不太可能是“偶然”的单子。因此,我非常怀疑 jQuery API 作为一个整体能否满足单子定律(即“jQuery 是单子”)。

这并不意味着给定的(非常受限的)子集可能无法满足它们,而是整个 API 可能包含“不安全”的操作,这些操作在使用时会违反法律,从而破坏抽象。

由于似乎没有人提供证据证明 API 全部或部分满足法律,我建议我们应该假设它不满足,直到提供证据。

必须显示:

什么 jQuery 操作对应于return(将值提升到 jQuery monad)? 什么 jQuery 操作对应于bind,用于将计算粘合在一起? 左、右和结合律如何适用于这些操作?

那么,考虑到 jQuery API 的其余部分,哪些违法行为是可能的?例如,我可以通过调用其他 API 函数之一来破坏 bind 吗?

参考资料:

jQuery is not a monad jQuery still is not a monad

【讨论】:

【参考方案2】:

我认为您指的是 jQuery 的隐式循环行为。在这方面,jQuery 类似于在 list monad 中工作,其中链接相当于 bind,而在 $() 中包装元素类似于 return(我猜)。

因此,在 jquery 中,您可以将一个新的列表元素附加到一组 div 列表中:

$('div').children().append("<li>New list element</li>");

...在 haskell 中你可能有:

appendToEachList divs = divs >>= children >>= append "<li>New list element</li>"

以上内容来自记忆,应视为伪代码废话。

无论如何,我认为说“jQuery 是 Monad”有点牵强。

【讨论】:

以上是关于jQuery是一个单子吗的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 中有啥有趣的交换单子吗?

函数单子真的提供了比函数应用函子更多的东西吗?如果是这样,是啥?

为啥我们需要单子?

这是一个啥样的结构? (具有部分逆但不是共单子的单子)

如果你违反了单子法则,你会发生啥?

自学编程在家接单有可能吗?