Στο Haskell, ποια είναι η διαφορά μεταξύ του χειριστή δέσμευσης και του χειριστή Kleisli και πώς συνδέονται;


Απάντηση 1:

Υποθέτω ότι:

  • Ο δεσμευτής είναι ο μοναδικός δεσμός: >> = 'Ο χειριστής Kleisli' είναι η σύνθεση των βέλους Kleisli (γνωστός και ως «fish»):> =>

Πρώτον, ένα βέλος Kleisli αποτελεί συνάρτηση της μορφής

a -> mb

Για μερικούς μήνες. Μπορούμε να συνθέσουμε δύο βέλη αυτής της φόρμας για να σχηματίσουμε ένα τρίτο, όπως η συνήθης συνθετική λειτουργία (εκτός από τη σειρά των παραδειγμάτων). Αυτός είναι ο χειριστής σύνθεσης βέλους Kleisli (γνωστός και ως «fish»):

(-> mb) - το πρώτο βέλος Kleisli -> (b -> mc) - το δεύτερο βέλος Kleisli -> (a -> mc)

Αν επιλέξουμε να ορίσουμε μονοάδες με επιστροφή και συμμετοχή, τότε μπορούμε να γράψουμε ως εξής

(f> = g) x = ένωση (g <$> fx)

επειδή

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

Όπου <$> είναι η παραλλαγή infix του fmap. Στη σημείωση χωρίς σημείο:

f> => g = συμμετοχή. fmap g. φά

(Θυμηθείτε ότι η επιστροφή περιτυλίγει μια καθαρή τιμή και η ένωση αφαιρεί ένα επίπεδο φωλεοποίησης (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