في Haskell ، ما هو الفرق بين عامل الربط والمشغل Kleisli ، وكيف ترتبط؟


الاجابه 1:

أفترض أن:

  • 'عامل الربط' هو الرابط الأحادي: >> = 'عامل التشغيل Kleisli' هو تكوين أسهم Kleisli (تُعرف أيضًا باسم 'fish'):> =>

أولاً ، يمثل سهم Kleisli دالة في النموذج

أ -> ميغابايت

بالنسبة لبعض monad م. يمكننا تكوين سهمين من هذا النموذج لتشكيل تكوين ثالث ، مثل تكوين الوظيفة العادية (باستثناء ترتيب الوسائط). هذا هو مشغل تكوين سهم Kleisli (المعروف أيضًا باسم 'fish'):

(> =>) :: (a -> mb) - سهم Kleisli الأول -> (b -> mc) - سهم Kleisli الثاني -> (a -> mc)

إذا اخترنا تعريف monads بالعودة والانضمام ، فيمكننا كتابة هذا كـ

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

لان

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

حيث <$> هو متغير infix fmap. في التدوين الخالي من النقاط:

f> => g = join. fmap g. F

(تذكر أن الإرجاع يلتف بقيمة نقية وينضم يزيل مستوى واحد من التعشيش (م (م) -> م).)

يطبق مشغل الربط سهم Kleisli على قيمة أحادية:

(>> =) :: ma - القيمة الأحادية -> (a -> mb) - سهم Kleisli -> mb

يمكن تعريفه أيضًا من حيث العودة والانضمام:

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

وبالمثل ، لأن

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

يمكننا ، في الواقع ، تحديد الربط من حيث "الأسماك" والعكس بالعكس:

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