У чым розніца паміж аператарам прывязкі і аператарам kleisli ў Haskell і чым яны звязаны?


адказ 1:

Я мяркую, што:

  • 'Аператар прывязкі' - гэта манадычная прывязка: >> = 'Аператар Клейслі' - гэта склад стрэлак Клейслі (таксама вядомы як "рыба"):> =>

Па-першае, стрэлка Клейсі - гэта функцыя формы

a -> mb

На працягу некалькіх месяцаў Мы можам пакласці дзве стрэлкі гэтай формы, каб утварыць трэцюю, як у нармальнай кампазіцыі функцый (за выключэннем парадку аргументаў). Гэта аператар кампазіцыі са стрэлкамі Kleisli (таксама вядомы як "рыба"):

(> =>) :: (a -> mb) - першая стрэлка Kleisli -> (b -> mc) - другая стрэлка Kleisli -> (a -> mc)

Калі мы вызначым манады з вяртаннем і далучэннем, мы можам напісаць гэта як

(f> => g) x = далучыцца (g <$> fx)

там

(г $ fx) :: м (мк)

Дзе <$ - гэта варыянт інфіксацыі fmap. У кропкавай абазначэнні:

f> => g = далучыцца. fmap g. f

(Памятайце, што вяртанне заключае ў сабе чыстае значэнне, а аб'яднанне выдаляе ўзровень гнездавання (m (ma) -> ma).)

Аператар прывязкі прымяняе стрэлку Kleisli да манадычнага значэння:

(>> =) :: ma - манадычнае значэнне -> (a -> mb) - стрэлка Kleisli -> mb

Ён таксама можа быць вызначаны ў плане вяртання і далучэння:

mx >> = f = далучыцца (f <$> mx)

Гэтак жа і таму

(f $ mx) :: m (mb)

Мы сапраўды можам вызначыць сувязь як "рыбу" і наадварот:

mx >> = f = (const mx> => f) () (f> => g) x = fx >> = g