申请人撰写,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
的值 at
和af
两个计算的值之间进行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
不是。”
如果您有应用程序A1
和A2
,那么typesdata A3 a = A3 (A1 (A2 a))
也是可应用的(您可以用通用的方式编写这样的实例)。
另一方面,如果有单元M1
和M2
那么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形的情况下,两个不同的单体重合。