Изменить: мы будем называть стрелку p
чистой, если существует такая функция f
, которая: p = arr f
.
Я пытаюсь лучше понять Arrows в Haskell и хочу выяснить, когда
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
, что f >>> (g &&& h) ≠ (f >>> g) &&& (f >>> h)
. Действительно ли это утверждение верно для f, g, h :: Kleisli ((->) e) a b
, и если да, то может ли это быть действительным доказательством этого: эффект Monad ((->) e)
считывается из окружающей среды. Таким образом, результатом применения f
является функция, с помощью которой g
и h
собираются читать из окружения. Независимо от того, где была создана эта функция — она одинакова, поскольку каждый раз применяется к одному и тому же аргументу, поэтому результат чтения из окружения один и тот же, поэтому общий результат тоже одинаков.
Reader
иWriter
с идемпотентным моноидом? - person leftaroundabout   schedule 13.08.2019Either
иMaybe
монады в список, поскольку их эффект зависит от последовательности приложений, и, согласно определению(&&&)
, приложения одинаковы и находятся в том же порядке слева рука и правая рука. Но я могу ошибаться. Что вы думаете? - person Zhiltsoff Igor   schedule 13.08.2019