p
编辑:如果存在这样的函数,我们将调用纯箭头f
: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
that的值f >>> (g &&& h) ≠ (f >>> g) &&& (f >>> h)
。这个陈述对于 真的是真的吗f, g, h :: Kleisli ((->) e) a b
,如果是的话,这是否是一个有效的证明: 的效果Monad ((->) e)
是从环境中读取。因此,应用的结果f
是函数将借助该函数从环境中读取g
。h
无论这个函数是在哪里创建的——都是一样的,因为它每次都应用于同一个参数,因此从环境中读取的结果是相同的,因此整体结果也是一样的。