申请人撰写,monads不

申请人撰写,monads不。

上述说法是什么意思? 何时比其他人更喜欢?

如果我们比较types

 (<*>) :: Applicative a => a (s -> t) -> as -> at (>>=) :: Monad m => ms -> (s -> mt) -> mt 

我们得到了将这两个概念分开的线索。 (>>=)types中的(s -> mt)表示s中的值可以确定mt计算的行为。 Monads允许值和计算层之间的干扰。 (<*>)运算符不允许这样的干扰:函数和参数计算不依赖于值。 这真的咬人 比较

 miffy :: Monad m => m Bool -> mx -> mx -> mx miffy mb mt mf = do b <- mb if b then mt else mf 

它使用某种效应的结果来决定两次计算 (例如发射导弹和签署停战协议),而

 iffy :: Applicative a => a Bool -> ax -> ax -> ax iffy ab at af = pure cond <*> ab <*> at <*> af where cond btf = if b then t else f 

它使用ab 的值 ataf两个计算的值之间进行select, 两个计算都可能导致悲剧效应。

一元版本基本上依赖于(>>=)的额外能力从一个值中select一个计算,这可能很重要。 然而,支持这种力量使monad难以构成。 如果我们试图build立“双重束缚”

 (>>>>==) :: (Monad m, Monad n) => m (ns) -> (s -> m (nt)) -> m (nt) mns >>>>== f = mns >>-{-m-} \ ns -> let nmnt = ns >>= (return . f) in ??? 

我们得到这一点,但现在我们的层都混乱起来。 我们有一个n (m (nt)) ,所以我们需要摆脱外部n 。 正如亚历山大C说,如果我们有一个合适的,我们可以做到这一点

 swap :: n (mt) -> m (nt) 

n向内排列,并把它和另一个n

较弱的“双重申请”更容易界定

 (<<**>>) :: (Applicative a, Applicative b) => a (b (s -> t)) -> a (bs) -> a (bt) abf <<**>> abs = pure (<*>) <*> abf <*> abs 

因为层之间没有干扰。

相应地,当你确实需要Monad的额外function,以及何时能够使用Applicative支持的刚性计算结构的时候,这是很好的办法。

请注意,顺便说一下,虽然编写monad是困难的,但可能比您需要的要多。 m (nv)表示用m效果计算,然后用n效果计算一个v值,其中m效果在n效果开始之前完成(因此需要swap )。 如果你只是想交错m效应,那么组合也许是太多的要求!

申请人撰写,monads不。

Monad写作,但结果可能不是一个monad。 相反,两个申请人的组成是必要的。 我怀疑原始声明的意图是“应用性构成,而单调性不。” 换句话说,“ Applicative是在合成之下closures的, Monad不是。”

如果您有应用程序A1A2 ,那么typesdata A3 a = A3 (A1 (A2 a))也是可应用的(您可以用通用的方式编写这样的实例)。

另一方面,如果有单元M1M2那么typesdata M3 a = M3 (M1 (M2 a))不一定是单子(对于>>=或组合join没有合理的通用实现)。

一个例子可以是types[String -> a] (这里我们用(->) String组成一个types构造函数[] ,它们都是monad)。 你可以很容易地写

 app :: [String -> (a -> b)] -> [String -> a] -> [String -> b] app fx = (<*>) <$> f <*> x 

这一概念适用于任何应用:

 app :: (Applicative f, Applicative f1) => f (f1 (a -> b)) -> f (f1 a) -> f (f1 b) 

但是没有明确的定义

 join :: [String -> [String -> a]] -> [String -> a] 

不幸的是,我们真正的目标,monads的组成,是比较困难的。 事实上,我们实际上可以certificate,从某种意义上说,没有办法用上面的types构造一个只用两个monad的操作的连接函数(参见附录中的certificate大纲)。 因此,我们可能希望形成一个构图的唯一方法是,如果有一些额外的结构连接这两个组件。

编写monads, http: //web.cecs.pdx.edu/~mpj/pubs/RR-1004.pdf

分配律解决schemel:MN – > NM就足够了

保证NM的一元性。 要看到这个,你需要一个单位和一个mult。 我会专注于mult(单位是unit_N unitM)

 NMNM - l -> NNMM - mult_N mult_M -> NM 

这并不能保证MN是一个monad。

然而,关键的观察,当你有分配的法律解决scheme时发挥作用

 l1 : ML -> LM l2 : NL -> LN l3 : NM -> MN 

因此,LM,LN和MN是单子。 问题出现在LMN是否是一个monad(或者是

(MN)L→L(MN)或N(LM)→(LM)N

我们有足够的结构来制作这些地图。 然而,正如郑和平所观察到的 ,我们需要一个六边形的条件(即相当于杨氏 – 巴克斯特方程的表述)来保证任一结构的一元性。 事实上,在六angular形的情况下,两个不同的单体重合。