【发布时间】:2023-03-04 22:59:01
【问题描述】:
Here's the SO post I'm going to refer to。 Also, I'm going to use the same snippets as the OP in that question in order not to separate the materials.
widely known 是 ArrowApply 实例产生一个 Monad,反之亦然:
newtype ArrowMonad a b = ArrowMonad (a () b)
instance Arrow a => Functor (ArrowMonad a) where
fmap f (ArrowMonad m) = ArrowMonad $ m >>> arr f
instance Arrow a => Applicative (ArrowMonad a) where
pure x = ArrowMonad (arr (const x))
ArrowMonad f <*> ArrowMonad x = ArrowMonad (f &&& x >>> arr (uncurry id))
instance ArrowApply a => Monad (ArrowMonad a) where
ArrowMonad m >>= f = ArrowMonad $
m >>> arr (\x -> let ArrowMonad h = f x in (h, ())) >>> app
newtype Kleisli m a b = Kleisli { runKleisli :: a -> m b }
instance Monad m => Category (Kleisli m) where
id = Kleisli return
(Kleisli f) . (Kleisli g) = Kleisli (\b -> g b >>= f)
instance Monad m => Arrow (Kleisli m) where
arr f = Kleisli (return . f)
first (Kleisli f) = Kleisli (\ ~(b,d) -> f b >>= \c -> return (c,d))
second (Kleisli f) = Kleisli (\ ~(d,b) -> f b >>= \c -> return (d,c))
在我偶然发现上面提到的post 之前,我觉得这个sn-p 是ArrowApply 和Monad 类等价的合理证明。然而,知道Arrow and Applicative are not, in fact, equivalent 和下面的sn-p 让我对Monad 和ArrowApply 等价的完整证明感到好奇:
newtype Arrplicative arr o a = Arrplicative{ runArrplicative :: arr o a }
instance (Arrow arr) => Functor (Arrplicative arr o) where
fmap f = Arrplicative . (arr f .) . runArrplicative
instance (Arrow arr) => Applicative (Arrplicative arr o) where
pure = Arrplicative . arr . const
Arrplicative af <*> Arrplicative ax = Arrplicative $
arr (uncurry ($)) . (af &&& ax)
newtype Applicarrow f a b = Applicarrow{ runApplicarrow :: f (a -> b) }
instance (Applicative f) => Category (Applicarrow f) where
id = Applicarrow $ pure id
Applicarrow g . Applicarrow f = Applicarrow $ (.) <$> g <*> f
instance (Applicative f) => Arrow (Applicarrow f) where
arr = Applicarrow . pure
first (Applicarrow f) = Applicarrow $ first <$> f
Thus if you round trip through applicative you lose some features.
写下来的例子很明显,但我无法理解通过 Monad 的“往返”如何保留所有 ArrowApply 功能,因为最初我们有一个取决于某些输入的箭头 (a b c) 但在最后,我们最终得到一个强制进入包装器的箭头,该包装器的输入类型为单位类型 (ArrowMonad (a () b))。
很明显我在这里做错了什么,但我无法理解到底是什么。
ArrowApply 和 Monad 等价的完整证据是什么?
Arrow 和 Applicative 不等价的例子说明了什么?一个人能概括另一个人吗?
箭头演算和范畴论对整个情况的解释是什么?
我将不胜感激完整的解释和提示,它们可以帮助人们自己拟定一份似是而非的证据。
【问题讨论】:
标签: haskell monads applicative category-theory arrows