Hakellā atšķirība starp iesiešanas operatoru un Kleisli operatoru un kā tie ir saistīti?


Atbilde 1:

Es pieņemu, ka:

  • 'Saistošais operators' ir monādiskais saite: >> = 'Kleisli operators' ir Kleisli bultas (sauktas arī par 'zivīm'):> =>

Pirmkārt, Kleisli bultiņa ir formas funkcija

a -> mb

Dažām monādēm m. Mēs varam sastādīt divas šīs formas bultiņas, lai veidotu trešo, tāpat kā parasto funkciju sastāvu (izņemot argumentu secību). Šis ir Kleisli bultas kompozīcijas operators (pazīstams arī kā “zivis”):

(> =>) :: (a -> mb) - pirmā Kleisli bulta -> (b -> mc) - otrā Kleisli bulta -> (a -> mc)

Ja mēs izvēlamies definēt monādes ar atgriešanos un pievienoties, tad mēs to varam uzrakstīt kā

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

jo

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

Kur <$> ir fmap infix variants. Apzīmējumā bez punktiem:

f> => g = pievienoties. fmap g. f

(Atgādiniet, ka atgriešanās apņem tīru vērtību un pievienošanās noņem vienu ligzdošanas līmeni (m (ma) -> ma).)

Saistošais operators monādiskajai vērtībai piemēro Kleisli bultiņu:

(>> =) :: ma - monādiskā vērtība -> (a -> mb) - Kleisli bultiņa -> mb

To var definēt arī kā atgriešanos un pievienošanos:

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

Līdzīgi tāpēc, ka

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

Faktiski mēs varam definēt saistību ar “zivīm” un otrādi:

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