Cili është ndryshimi midis operatorit lidhës dhe operatorit kleisli në Haskell dhe si lidhen ato?


përgjigje 1:

Unë supozoj se:

  • 'Operatori lidhës' është lidhës monadik: >> = 'Operatori Kleisli' është përbërja e shigjetave Kleisli (e njohur edhe si 'peshk'):> =>

Së pari, një shigjetë Kleisli është një funksion i formës

a -> mb

Për disa muaj Ne mund të vendosim së bashku dy shigjeta të kësaj forme për të formuar një të tretë, si në përbërjen funksionale normale (përveç rendit të argumenteve). Ky është operatori i përbërjes së shigjetave Kleisli (i njohur edhe si "peshk"):

(> =>) :: (a -> mb) - shigjeta e parë e Kleisli -> (b -> mc) - shigjeta e dytë e Kleisli -> (a -> mc)

Nëse përcaktojmë monadat me kthim dhe bashkim, mund ta shkruajmë këtë si

(f> => g) x = bashkohet (g <$> fx)

sepse

(g $ fx) :: m (mc)

Ku <$> është varianti infix i fmap. Në shënimin pa pikë:

f> => g = bashkohet. fmap g. f

(Mos harroni se kthimi mbyll një vlerë të pastër dhe bashkohet heq një nivel fole (m (ma) -> ma).)

Operatori lidhës aplikon një shigjetë Kleisli në një vlerë monadike:

(>>> =) :: ma - vlera monadike -> (a -> mb) - shigjeta Kleisli -> mb

Ai gjithashtu mund të përcaktohet në drejtim të kthimit dhe të bashkohet:

mx >> = f = bashkohu (f <$> mx)

Po kështu sepse

(f $ mx) :: m (mb)

Ne në fakt mund ta përcaktojmë lidhjen si "peshk" dhe anasjelltas:

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