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是一个单子吗的主要内容,如果未能解决你的问题,请参考以下文章