これが私が参照するSOの投稿です。また、資料を分離しないために、その質問ではOPと同じスニペットを使用します。
インスタンスがモナドを生成すること、およびその逆が広く知られていArrowApply
ます。
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))
そして、上記の記事に出くわすまで、このスニペットはArrowApply
とMonad
クラスの同等性のもっともらしい証明であると感じました。しかし、ArrowとApplicativeは実際には同等ではないことを知っているので、次のスニペットは、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
>したがって、アプリケーションを介して往復すると、一部の機能が失われます。
例が提供されている場合、それは明らかです、まだ私はモナドはすべてArrowApplyが最初に我々はいくつかの入力(に依存矢印を持っていたので、備えて保存して、「ラウンドトリップ」する方法を把握することができないa b c
)が、最後に、我々は、で終わります入力タイプがユニットタイプであるラッパーに強制された矢印(ArrowMonad (a () b)
)。
ここで私がひどく間違ったことをしているのは明らかですが、正確には何を理解できません。
完全な証拠は何であるArrowApply
とMonad
等価ですか?
の非等価性の例Arrow
とApplicative
説明は何ですか?ある人は別の人を一般化しますか?
アロー計算とカテゴリー理論におけるその全体的な状況の解釈は何ですか?
完全な説明と、証拠となるものを自分で作成するのに役立つヒントの両方をいただければ幸いです。