gpt4 book ai didi

haskell - `(<*>) = ap` Applicative/Monad 法则到底如何关联这两个类?

转载 作者:行者123 更新时间:2023-12-03 01:09:28 25 4
gpt4 key购买 nike

ap没有记录的规范,并带有注释指出它可能是 <*> ,但不是出于实际原因:

ap                :: (Monad m) => m (a -> b) -> m a -> m b
ap m1 m2 = do { x1 <- m1; x2 <- m2; return (x1 x2) }
-- Since many Applicative instances define (<*>) = ap, we
-- cannot define ap = (<*>)

所以我假设 ap(<*>) = ap law 是“ap 的右侧”的简写,并且 law 实际上表达了 >>= 之间的关系。 , return<*>正确的?否则法律就没有意义。

上下文是我在思考Validation它似乎没有合法性,这是多么令人不满意Monad实例。我也在考虑ApplicativeDo以及这种转变如何让我们从 Monad 的实际影响中恢复过来Validation 的实例;我最常想做的就是尽可能地累积错误,但在必要时仍然能够使用bind。我们实际上导出了一个bindV我们几乎在任何地方都需要使用这个函数,这有点 absurd 。我能想到的无法无天的唯一实际后果是,我们积累了不同或更少的错误,具体取决于我们使用哪种组合(或者理论上我们的程序如何通过重写规则进行转换,尽管我不确定为什么应用组合会永远存在)转换为一元)。

编辑:Monad中相同法律的文档更广泛:

Furthermore, the Monad and Applicative operations should relate as follows:

pure = return
(<*>) = ap

The above laws imply:

fmap f xs  =  xs >>= return . f
(>>) = (*>)

“上述法律意味着”...那么这里的想法是这些是我们关心的真正法律吗?

但现在我只能在 Validation 的背景下尝试理解这些内容。第一条定律成立。如果我们只定义(>>) = (*>),第二个显然可以成立。 。

但是 Monad 的文档令人惊讶的是,关于如何>>什么也没说(除非我只是错过了)应该相关。想必我们想要这样

a >> b = a >>= \_ -> b

...和 ​​(>>)包含在类中,以便可以为了效率而重写它,但这从未完全进入文档。

所以,如果是这样,那么我猜是这样的 MonadApplicative关联实际上是这样的:

return = pure
xs >>= return . f = fmap f xs
a >>= \_ -> b = fmap (const id) a <*> b

最佳答案

每个Monad产生Applicative ,并为此引发Applicative , <*> = ap将定义地成立。但给定两个结构 - Monad mApplicative m - 如果没有这两个法律,则无法保证这些结构一致 <*> = appure = return 。例如,采用“常规”Monad列表的实例,以及 zip-list Applicative实例。虽然 Monad 从根本上来说并没有什么“错误”。和Applicative如果不同意,它可能会让大多数用户感到困惑,因此 Monad 禁止这样做。法律。

tl;dr 有关法律旨在确保 MonadApplicative以直观明显的方式达成一致。

关于haskell - `(<*>) = ap` Applicative/Monad 法则到底如何关联这两个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46913472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com