سؤال

لدي سؤال بخصوص نوعين إنت - > (إنت - > إنت) و (إنت - > إنت) - > إنت.ما هو الفرق بين هذين?

قرأت هنا في مكان ما أن أول واحد يمكن أن تفسر على أنها وظيفة أن يأخذ إنت وإرجاع وظيفة التي تأخذ و إنت وإرجاع إنت ، وهو نفس إنت ->إنت -> إنت.هل هذا صحيح?

هل كانت مفيدة؟

المحلول

الفرق بين int -> (int -> int) و int -> int -> int لا يكاد يذكر (كنت حقا الرعاية فقط إذا كان لديك لتتداخل مع لغة أخرى).هذه هي وظائف كاري التي تأخذ على نحو فعال اثنين من الأعداد الصحيحة وإرجاع عدد صحيح (على سبيل المثال ، المدمج في عامل بالإضافة لديه نوع على طول هذه الخطوط).

ومع ذلك ، فإن كلاهما مختلف تماما عن (int -> int) -> int, ، الذي يأخذ وظيفة من الأعداد الصحيحة إلى الأعداد الصحيحة وإرجاع عدد صحيح.كما ذكر آخرون ، فإن المثال البسيط الوحيد لمثل هذه الوظيفة سيطبق الوظيفة المعينة على قيمة معينة (على سبيل المثال. fun (f:int->int) -> f 13).

نصائح أخرى

سؤال جيد ، أظن أنه لا يوجد فرق كبير من الناحية الوظيفية.لقد أمضيت بعض الوقت في محاولة لمعرفة كيفية الحصول على هذين التوقيعين.(يعطي رمز الترميز العام لجون بالمر رمزًا ترميزيًا عامًا لي) Genacodicetagpre

لا يمكنني التفكير في مثال غير مفتعل للتوقيع الثاني: Genacodicetagpre

(هذا لا يجيب مباشرة على سؤالك ، ولكنه قد يعطي شخصًا آخر شيئًا يمضغه)

أنا لا أعرف F # حقًا ، لكن يبدو الأمر بديهيًا تمامًا (العديد من اللغات الأخرى لها نفس المفاهيم).

  1. دالة تأخذ int ، وتعيد دالة تأخذ int وتعيد int
  2. هي وظيفة تأخذ دالة تأخذ int وتعيد int ، وتعيد int

الأول سيكون نوعًا ما مثل وظيفة الكاري.

لذلك دعونا نرى كيف ستبدو عمليات التنفيذ:

أولاً

let func1 i = fun j -> i+j

هذا له توقيع int -> (int -> int)

.لاحظ أن func1 2 3 لا ينبغي أن تعمل

يحرر: اتضح أنه نظرًا للطريقة التي تعمل بها عملية الترابط، فإن هذا أمر جيد بالفعل

ولكن هذا يختلف عن

let func2 i j= i+j

الذي لديه نوع من int -> int -> int

هنا func2 1 2 على ما يرام

المثال الآخر الذي يمكننا إنشاؤه مثل هذا:

let func4 a = a 1

سيكون لهذا توقيع ('t->int) -> u اختيار الخرسانة a سيعمل.لاحظ أن func4 1 2 بالتأكيد لن يتم تجميعها

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top