【发布时间】:2019-12-19 14:11:07
【问题描述】:
编辑:如果存在这样的函数f,我们将调用一个箭头ppure:p = arr f。
我正在尝试更好地掌握 Haskell 中的 Arrows,我想知道何时
f >>> (g &&& h) = (f >>> g) &&& (f >>> h),其中f、g、h 是箭头。
显然,这通常不是真的。在此特定示例中,副作用在右侧重复:
GHCi> c = Kleisli $ \x -> ("AB", x + 1)
GHCi> fst . runKleisli (c >>> c &&& c) $ 1
"ABABAB"
GHCi> fst . runKleisli ((c >>> c) &&& (c >>> c)) $ 1
"ABABABAB"
显然,f >>> (g &&& h) = (f >>> g) &&& (f >>> h) 如果f 是纯的。
我在 GHCi 中使用 f, g, h :: Kleisli ((->) e) a b 的此语句进行试验,但没有找到 f、g 和 h 的值,即 f >>> (g &&& h) ≠ (f >>> g) &&& (f >>> h)。这个陈述对于f, g, h :: Kleisli ((->) e) a b 是否确实如此,如果是这样,这是否可以作为一个有效的证明:
Monad ((->) e) 的效果是从环境中读取。因此,f 的应用结果是 g 和 h 将从环境中读取的函数。无论这个函数是在哪里创建的——都是一样的,因为它每次都应用于同一个参数,因此从环境中读取的结果是一样的,因此总体结果也是一样的。
【问题讨论】:
-
有趣的后续问题:哪些 monad 具有此属性?它们都同构于
Reader和Writer与idempotent 幺半群的组合吗? -
@leftaroundabout 我很确定我们可以将
Either和MaybeMonads 添加到列表中,因为它们的效果取决于应用程序的顺序,并且根据(&&&)的定义,应用程序是相同的,并且在左手和右手上的顺序相同。但我可能弄错了。你怎么看?
标签: haskell monads arrows reader-monad kleisli