I Haskell, vad är skillnaden mellan bindningsoperatören och Kleisli-operatören och hur är de relaterade?


Svar 1:

Jag antar att:

  • 'Bindoperatören' är den monadiska bindningen: >> = 'Kleisli-operatören' är sammansättningen av Kleisli-pilarna (alias 'fisk'):> =>

För det första är en Kleisli-pil en funktion av formen

a -> mb

För vissa monad m. Vi kan komponera två pilar av den här formen för att bilda en tredje, som normal funktionskomposition (med undantag för argumentens ordning). Detta är Kleisli-pilkompositionsoperatören (alias "fisk"):

(> =>) :: (a -> mb) - den första Kleisli-pilen -> (b -> mc) - den andra Kleisli-pilen -> (a -> mc)

Om vi ​​väljer att definiera monader med retur och gå med, kan vi skriva detta som

(f> => g) x = gå med (g <$> fx)

eftersom

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

Där <$> är infixvarianten av fmap. I punktfri notation:

f> => g = gå med. fmap g. f

(Kom ihåg att retur sveper ett rent värde och sammanfogar bort en nivå av häckning (m (ma) -> ma).)

Bindoperatören tillämpar en Kleisli-pil på ett monadiskt värde:

(>> =) :: ma - det monadiska värdet -> (a -> mb) - Kleisli-pilen -> mb

Det kan också definieras i termer av retur och gå med:

mx >> = f = gå med (f <$> mx)

På samma sätt, för

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

Vi kan faktiskt definiera bindning i termer av "fisk" och vice versa:

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