Hvad er forskellen mellem bindingsoperatøren og Kleisli-operatøren i Haskell, og hvordan er de relaterede?


Svar 1:

Jeg antager, at:

  • 'Bindoperatøren' er den monadiske binding: >> = 'Kleisli-operatøren' er sammensætningen af ​​Kleisli-pilene (alias 'fisk'):> =>

For det første er en Kleisli-pil en funktion af formen

a -> mb

For nogle monad m. Vi kan komponere to pile på denne form til at danne en tredje, ligesom normal funktionskomposition (bortset fra rækkefølgen af ​​argumenter). Dette er operatøren til sammensætning af pilen Kleisli (også kendt som 'fisk'):

(> =>) :: (a -> mb) - den første Kleisli-pil -> (b -> mc) - den anden Kleisli-pil -> (a -> mc)

Hvis vi vælger at definere monader med retur og sammenføjning, kan vi skrive dette som

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

fordi

(g <$> fx) :: m (mc)

Hvor <$> er infix-varianten af ​​fmap. I punktfri notation:

f> => g = slutte sig til. fmap g. f

(Husk, at returnerer indpakning af en ren værdi og sammenføjning fjerner et niveau af rede (m (ma) -> ma).)

Bindingsoperatøren anvender en Kleisli-pil til en monadisk værdi:

(>> =) :: ma - den monadiske værdi -> (a -> mb) - Kleisli-pilen -> mb

Det kan også defineres med hensyn til returnering og tilslutning:

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

Tilsvarende fordi

(f <$> mx) :: m (mb)

Vi kan faktisk definere bind i form af 'fisk' og omvendt:

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