Вот ТАК, что я собираюсь сослаться на . Кроме того, я собираюсь использовать те же фрагменты, что и ОП в этом вопросе, чтобы не разделять материалы .
Это широко известно , что * Экземпляр 1009 * дает монаду и наоборот:
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
> Таким образом, если вы совершаете обратное путешествие по аппликативу, вы теряете некоторые особенности. Очевидно, что если приведены примеры, но я не могу сказать asp, как «круговое отключение» через Monad сохраняет все функции ArrowApply, так как изначально у нас была стрелка, которая зависит от некоторого ввода (a b c
), но в конце мы получаем стрелу, вставленную в оболочку, у которой в качестве типа ввода (ArrowMonad (a () b)
) указан тип блока (*1027*).
Очевидно, что я делаю здесь что-то ужасно неправильно, но не могу понять, что именно.
Что является полным доказательством того, что ArrowApply
и Monad
эквивалентны?
Что объясняют примеры неэквивалентности Arrow
и Applicative
? Обобщает ли одно другое?
Какова интерпретация всей этой ситуации в исчислении стрел и теории категорий?
Я был бы признателен за полные объяснения и советы, которые могли бы помочь составить правдоподобный фрагмент доказать себя.