للكتابة النمطية للدالة g
في هذا السياق، نحتاج إلى استخدام تعابير النوع (Type signatures) للدوال المستخدمة كمعاملات. في الحالة الأولى، f1
يأخذ قيمة من نوع a
ويعيد قائمة من a
، وفي الحالة الثانية، f2
يأخذ Int
ويعيد Int
. لذلك، نحتاج إلى تعبير عن نوعي الدوال f1
و f2
، ونستخدم الحرف a
للإشارة إلى نوع غير معروف.
الدالة g
تأخذ دالة f
وقيمتين x
و y
، وتعيد زوجًا من القيم التي تم تطبيق f
عليهما. لذا، تعبير النوع الكامل لـ g
سيكون كالتالي:
haskellg :: (a -> b) -> a -> a -> (b, b) g f x y = (f x, f y)
الآن، بما أن f1
تأخذ قيمة من نوع a
وتعيد قائمة من a
، يمكننا أن نفترض أن a
هنا يمكن أن يكون Int
أو Char
أو أي نوع آخر. بناءً على ذلك، يمكننا أن نكتب نوع f1
على النحو التالي:
haskellf1 :: a -> [a]
لكن، بما أن لدينا قيم محددة لـ x1
و c1
، يمكننا أن نفترض أن a
هنا هو Int
و Char
على التوالي، لذلك يمكن أن نكتب:
haskellf1 :: Int -> [Int] f1 x = [x] x1 :: Int x1 = 42 c1 :: Char c1 = 'c'
بالنسبة لـ f2
، فإنه يأخذ Int
ويعيد Int
، لذا يمكن كتابتها على النحو التالي:
haskellf2 :: Int -> Int f2 x = 3 * x
أخيرًا، يمكننا اختبار g
باستخدام القيم التي ذكرتها:
haskellg f1 x1 c1 == ([42], ['c']) :: ([Int], [Char]) g f2 x1 x2 == (126, 15) :: (Int, Int)
هذا يعطينا توقعاتنا بنجاح تنفيذ الدالة g
بالنسبة للقيم المعطاة.
المزيد من المعلومات
بالطبع! في لغة هاسكيل، يتم استخدام تعابير النوع (Type signatures) لوصف أنواع الدوال والقيم. يتمثل هذا في طريقة لتوضيح نوع الدوال والمتغيرات في الكود. على سبيل المثال، إذا كان لدينا دالة تأخذ قيمة واحدة وتعيد قيمة من نوع معين، يمكننا كتابة تعبير النوع لها كالتالي:
haskelladdOne :: Int -> Int addOne x = x + 1
في هذا المثال، تعبير النوع Int -> Int
يعني أن الدالة addOne
تأخذ Int
وتعيد Int
.
يمكن استخدام تعابير النوع أيضًا لتوضيح نوع المتغيرات. على سبيل المثال:
haskellx :: Int x = 5
في هذا المثال، تعبير النوع Int
يعني أن المتغير x
هو من نوع Int
وتساوي 5.
باستخدام تعابير النوع، يمكننا توضيح الأنواع بوضوح في الكود الهاسكيل، مما يساعد على فهم الكود وتجنب الأخطاء المحتملة ذات الصلة بالأنواع.