فهم حقيقة التكرير (تقنية في البرمجة الوظيفية)

في الرياضيات وعلم الحاسوب، يُعدّ التكرير أو الكرّية أو التقييس (بالإنجليزية: Currying)، تقنية لتحويل دالة تأخذ عدة وسائط إلى تسلسل من عائلات الدوال، تأخذ كل واحدة منها وسيطًا واحدًا فقط.

في المثال النموذجي، نبدأ بدالة







f

:

(

X

×

Y

)



Z





{\displaystyle f:(X\times Y)\to Z}



تأخذ وسيطين، أحدهما من







X





{\displaystyle X}



والآخر من







Y





{\displaystyle Y}



، وتنتج عناصر في







Z

.





{\displaystyle Z.}



الشكل المحوَّر من هذه الدالة يعامل الوسيط الأول كمعامل، لتكوين عائلة من الدوال









f



x





:

Y



Z

.





{\displaystyle f_{x}:Y\to Z.}



وتُنظَّم هذه العائلة بحيث يوجد لكل عنصر







x





{\displaystyle x}



في







X





{\displaystyle X}



دالة واحدة فقط









f



x





.





{\displaystyle f_{x}.}





في هذا المثال، تصبح











curry









{\displaystyle {\mbox{curry}}}



نفسها دالة، تأخذ







f





{\displaystyle f}



كوسيط، وتُعيد دالة تربط كل







x





{\displaystyle x}



بـ









f



x





.





{\displaystyle f_{x}.}



التمثيل الرمزي المناسب لذلك طويل نوعًا ما. فالدالة







f





{\displaystyle f}



تنتمي إلى مجموعة الدوال







(

X

×

Y

)



Z

.





{\displaystyle (X\times Y)\to Z.}



أما









f



x









{\displaystyle f_{x}}



فتنتمي إلى مجموعة الدوال







Y



Z

.





{\displaystyle Y\to Z.}



وعليه، فإن الشيء الذي يربط







x





{\displaystyle x}



بـ









f



x









{\displaystyle f_{x}}



سيكون من النوع







X



[

Y



Z

]

.





{\displaystyle X\to [Y\to Z].}



وبهذا الترميز، فإن











curry









{\displaystyle {\mbox{curry}}}



هي دالة تأخذ عناصر من المجموعة الأولى، وتُعيد عناصر من المجموعة الثانية، وتُكتب بالشكل











curry





:

[

(

X

×

Y

)



Z

]



(

X



[

Y



Z

]

)

.





{\displaystyle {\mbox{curry}}:[(X\times Y)\to Z]\to (X\to [Y\to Z]).}



هذا مثال غير رسمي بعض الشيء؛ إذ تُعرض تعريفات أدق لما يُقصد بـ "عنصر" و"دالة" لاحقًا. وتختلف هذه التعريفات حسب السياق، وتأخذ أشكالًا متعددة تبعًا للنظرية المعتمدة.

التحوير الكاري مرتبط بالتطبيق الجزئي، لكنه ليس الشيء نفسه. يمكن استخدام المثال أعلاه لتوضيح التطبيق الجزئي؛ وهو مشابه جدًا. التطبيق الجزئي هو الدالة











apply









{\displaystyle {\mbox{apply}}}



التي تأخذ الزوج







f





{\displaystyle f}



و







x





{\displaystyle x}



كوسيطين معًا، وتُعيد









f



x





.





{\displaystyle f_{x}.}



وباستخدام الترميز ذاته، تكون صيغة التطبيق الجزئي هي











apply





:

(

[

(

X

×

Y

)



Z

]

×

X

)



[

Y



Z

]

.





{\displaystyle {\mbox{apply}}:([(X\times Y)\to Z]\times X)\to [Y\to Z].}



ومكتوبة بهذه الطريقة، يمكن اعتبار دالة التطبيق مقابلة (adjoined) لدالة التحوير الكاري.

يمكن تعريف التحوير الكاري لدالة تحتوي على أكثر من وسيطين باستخدام الاستقراء.

التحوير الكاري مفيد في السياقات العملية والنظرية على حد سواء. ففي البرمجة الوظيفية ولغات البرمجة الأخرى، يوفّر طريقة لإدارة تمرير الوسيطات إلى الدوال والتعامل مع الاستثناءات بشكل تلقائي. أما في علم الحاسوب النظري، فهو يوفّر وسيلة لدراسة الدوال متعددة الوسائط ضمن نماذج نظرية أبسط لا تقبل سوى وسيط واحد. وتُعد الفئات الأحادية المغلقة (بالإنجليزية: closed monoidal categories) الإطار الأكثر تعميمًا للمفهوم الصارم للتحوير الكاري وعكسه، وهي تشكّل أساسًا لتعميم واسع لمقابلة تطابق كاري-هوارد بين الإثباتات والبرامج لتشمل بنيات أخرى كثيرة، مثل ميكانيكا الكم، والكوبوردية، ونظرية الأوتار.

قُدّمت فكرة التحوير الكاري لأول مرة بواسطة جوتلوب فريجه, وطُوّرت لاحقًا بواسطة موسى شونفينكل، وطُوّر لاحقًا بواسطة هاسكل كاري.

إلغاء التكرير هو تحويل الثنوية المقابل للتكرير، ويمكن اعتباره شكلاً من نزع التأدية. إذ يأخذ دالة







f





{\displaystyle f}



تُعيد كقيمة دالة أخرى







g





{\displaystyle g}



، ويُنتج دالة جديدة









f









{\displaystyle f'}



تأخذ كوسائط الوسيطات الخاصة بكل من







f





{\displaystyle f}



و







g





{\displaystyle g}



، وتُعيد كنتيجة تطبيق







f





{\displaystyle f}



ثم







g





{\displaystyle g}



على تلك الوسائط. ويمكن تكرار هذه العملية.

قراءة المقال الكامل على ويكيبيديا ←