باطل في قيود مع وحدة
-
19-09-2019 - |
سؤال
أود أن أفهم ما هو الفرق بين هذين مفاهيم البرمجة. يمثل الأول عدم وجود نوع البيانات وفي هذا النوع موجود، ولكن لا توجد معلومات. بالإضافة إلى ذلك، أدرك أن هذه الوحدة تأتي من الأساس النظري البرمجة الوظيفي، لكن ما زلت لا أستطيع أن أفهم ما هو قابلية استخدام الوحدة البدائية (على سبيل المثال، في برنامج F #).
المحلول
نوع الوحدة يجعل كل شيء أكثر انتظاما. إلى حد ما يمكنك التفكير في كل وظيفة في F # كأخذ معلمة واحدة وإرجاع نتيجة واحدة. تعمل الوظائف التي لا تحتاج إلى أي معلمات "وحدة" فعليا كمعلمة، ووظائف لا ترجع أي نتائج "وحدة" نتيجة لذلك. هذا لديه مجموعة متنوعة من المزايا؛ لأحد، اعتبر كيف في C # تحتاج إلى مجموعة من مفوضي "Func" لتمثيل مهام مختلفة من الآثار التي تعود القيم، بالإضافة إلى مفوضة "العمل" التي لا تعيد القيم (لأنها على سبيل المثال Func<int,void>
ليست قانونية - لا يمكن استخدامها باطلة بهذه الطريقة، لأنه ليس نوعا ما "حقيقي").
نصائح أخرى
في البرمجة الوظيفية، نتحدث عادة عن تعيين المدخلات إلى المخرجات. هذا يعني حرفيا تعيين حجة لقيمة عودتها. ولكن إذا كان هناك شيء سيكون وظيفة في معنى نظرية الرياضيات / الفئة، فإنه يجب أن يعود شيئا ما. وبعد أ void
القيمة تمثل أن وظيفة إرجاع أي شيء، وهو أمر لا معنى له في هذه الشروط.
unit
هي الإجابة الوظيفية ل void
. وبعد انها أساسا نوع مع قيمة واحدة فقط، ()
. وبعد لديها عدد من الاستخدامات، ولكن هنا واحد بسيط. دعنا نقول أن لديك شيء مثل هذا في لغة حتمية أكثر تقليدية:
public static <T, U> List<U> map(List<T> in, Function<T, U> func) {
List<U> out = new ArrayList<U>(in.size());
for (T t : in) {
out.add(func.apply(t));
}
return out;
}
هذا ينطبق وظيفة معينة func
إلى كل عنصر في القائمة، إنتاج قائمة جديدة من func
نوع الإخراج. ولكن ماذا يحدث إذا نجحت في وظيفة تطبع فقط حججها؟ لن يكون له نوع الإخراج، فما الذي يمكنك وضعه U
?
في بعض اللغات، سيتم تمرير هذه الوظيفة كسر هذا الرمز (مثل في C #، حيث لا يمكنك تعيينها void
إلى نوع عام). يجب عليك اللجوء إلى الحلول مثل وجود Action<T>
, ، والتي يمكن أن تحصل clunky.
هذا هو المكان الذي unit
مفيد: هو - هي يكون نوع، ولكن واحد قد يستغرق فقط قيمة واحدة. هذا يبسط بشكل كبير أشياء مثل التسلسل والتكوين، ويقلل إلى حد كبير من عدد الحالات الخاصة التي يجب أن تقلق بشأنها.