Для полноты картины я буду использовать этот ответ, чтобы расширить мой комментарий выше :
Хотя я на самом деле не записал доказательство, я считаю, чтоСлучаи смешанного освобождения и возврата закона композиции должны выполняться из-за параметричности.Я также подозреваю, что проще показать, используя моноидальное представление .
Моноидальное представление экземпляра Applicative
здесь:
unit = Return ()
Return x *&* v = (x,) <$> v
u *&* Return y = (,y) <$> u
-- I will also piggyback on the `Compose` applicative, as suggested above.
Free u *&* Free v = Free (getCompose (Compose u *&* Compose v))
При моноидальном представлении закон композиции / ассоциативности:
(u *&* v) *&* w ~ u *&* (v *&* w)
Теперь давайте рассмотрим один из его смешанных случаев;скажем, Free
- Return
- Free
one:
(Free fu *&* Return y) *&* Free fw ~ Free fu *&* (Return y *&* Free fw)
(Free fu *&* Return y) *&* Free fw -- LHS
((,y) <$> Free fu) *&* Free fw
Free fu *&* (Return y *&* Free fw) -- RHS
Free fu *&* ((y,) <$> Free fw)
Давайте посмотрим поближе на эту левую сторону.(,y) <$> Free fu
применяется (,y) :: a -> (a, b)
к значениям a
, найденным в Free fu :: FreeMonad f a
.Параметричность (или, более конкретно, свободная теорема для (*&*)
) означает, что не имеет значения, делаем ли мы это до или после использования (*&*)
.Это означает, что левая сторона составляет:
first (,y) <$> (Free fu *&* Free fw)
Аналогично, правая сторона становится:
second (y,) <$> (Free fu *&* Free fw)
, поскольку first (,y) :: (a, c) -> ((a, b), c)
и second (y,) :: (a, c) -> (a, (b, c))
одинаковы доДля повторной ассоциации пар имеем:
first (,y) <$> (Free fu *&* Free fw) ~ second (y,) <$> (Free fu *&* Free fw)
-- LHS ~ RHS
Другие смешанные случаи можно рассматривать аналогично.Для остальной части доказательства см. ответ Бенджамина Ходжсона .