الدالة الوظيفية (Functor)

يؤدي تطبيق هذه العملية fmap (+1)على شجرة ثنائية من الأعداد الصحيحة إلى زيادة كل عدد صحيح في الشجرة بمقدار واحد.

في البرمجة الوظيفية ، يُعدّ المُوَجِّه نمط تصميم مُستوحى من تعريف نظرية الفئات ، يسمح بتطبيق دالة على قيم داخل نوع عام دون تغيير بنية هذا النوع. في لغة هاسكل، يُمكن تجسيد هذه الفكرة في فئة نوع .

صنف الدالة f حيث fmap :: ( a -> b ) -> f a -> f b

ينص هذا الإعلان على أن أي نسخة من Functorيجب أن تدعم طريقة fmapتقوم بتعيين دالة على عناصر النسخة.

ينبغي أن تخضع الدوال في لغة هاسكل أيضًا لما يسمى بقوانين الدوال ، [ 1 ] والتي تنص على أن عملية التعيين تحافظ على دالة الهوية وتركيب الدوال:

fmap id = id fmap ( g . h ) = ( fmap g ) . ( fmap h )

حيث .يرمز إلى تركيب الدوال .

في لغة سكالا ، يمكن استخدام السمة بدلاً من ذلك :

trait Functor [ F [ _ ]] { def map [ A , B ]( a : F [ A ])( f : A => B ): F [ B ] }

تُشكّل الدوال أساسًا لتجريدات أكثر تعقيدًا مثل الدوال التطبيقية ، والمونادات ، والمونادات المشتركة ، والتي تُبنى جميعها على بنية الدوال الأساسية. تُفيد الدوال في نمذجة التأثيرات الوظيفية من خلال قيم أنواع البيانات المُعاملة. تُنمذج العمليات الحسابية القابلة للتعديل بالسماح بتطبيق دالة خالصة على قيم النوع "الداخلي"، مما يُنشئ القيمة الإجمالية الجديدة التي تُمثل العملية الحسابية المُعدّلة (والتي قد لا تكون قد نُفّذت بعد).

أمثلة

في لغة هاسكل، تُعد القوائم مثالًا بسيطًا على الدوال. يمكننا تنفيذها fmapعلى النحو التالي:

fmap f [] = [] fmap f ( x : xs ) = ( f x ) : fmap f xs

يمكن وصف الشجرة الثنائية بالمثل بأنها دالة:

بيانات الشجرة أ = ورقة | عقدة أ ( الشجرة أ ) ( الشجرة أ ) مثال شجرة الدوال حيث fmap f ورقة = ورقة fmap f ( عقدة س ل ر ) = عقدة ( f س ) ( fmap f ل ) ( fmap f ر )

إذا كان لدينا شجرة ثنائية ودالة ، فإن الدالة ستنطبق على كل عنصر من عناصر الشجرة . على سبيل المثال، إذا كانت الشجرة ثنائية ، فإن إضافة 1 إلى كل عنصر من عناصر الشجرة الثنائية يمكن التعبير عنها كالتالي : [ 2 ]tr :: Tree af :: a -> bfmap f trftraInttrfmap (+ 1) tr

انظر أيضاً

مراجع

  1. ^ يورجي ، برنت. "الموظف > القوانين" . هاسكل ويكي . تم الاسترجاع 17 يونيو 2023 .
  2. "الدوال الوظيفية" . لآلئ وظيفية . جامعة ميريلاند . تم الاطلاع عليه بتاريخ 12 ديسمبر 2022 .