编辑:如果存在这样的函数 f
,使得箭头 p
纯净,则我们将称箭头 p
为纯箭头:p = arr f
。
我试图更好地掌握 Haskell 中的 Arrow,并想要找出何时成立:
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
是纯函数,则 f >>> (g &&& h) = (f >>> g) &&& (f >>> h)
。我在 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
从环境中读取的函数。无论此函数在何处创建 - 它都是相同的,因为它每次都应用于相同的参数,因此从环境中读取的结果也是相同的,因此整体结果也是相同的。
Reader
和Writer
与idempotent单子的组合? - leftaroundabout