هذا النص هو ترجمة مجانية لسلسلة من المقالات ساشا باربر من برايتون ، المملكة المتحدة التي وجدت مثيرة للاهتمام بما فيه الكفاية.هذه هي المشاركة الأولى في سلسلة F # الخاصة بي. إذن ماذا سنغطي؟ كما يعلم الكثير من المبرمجين جيدًا ، من المعتاد أن نبدأ بمثال Hello World.
لذلك سوف نفعل ذلك تماما. لذلك ، دون مزيد من اللغط ، ما تحتاجه لإنشاء تطبيق منفصل "Hello World" في F #.
ومن هنا:
open System [<EntryPoint>] let main argv = printfn "Hello World" Console.ReadLine() |> ignore 0
// لسوء الحظ ، لم أتمكن من العثور على تخصيص الشفرة لـ F #قد لا يبدو هذا كافياً للمناقشة ، ولكن يوجد بالفعل شيء يجب مراعاته من أجل الانغماس في بعض مبادئ F #.
فما الذي يحدث بالضبط هنا؟
نظرًا لأن هذا تطبيق منفصل ، فمن الواضح أننا نحتاج إلى نقطة إدخال (مثل أي لغة .NET أخرى).
إذا كيف يتم تحديد نقطة الدخول؟
حسنًا ، هذا هو نفسه تقريبا كما هو الحال مع لغات .NET الأخرى ، لدينا طريقة رئيسية (أو دالة في مصطلحات # F) تأخذ مجموعة من الصفوف ، ونحن نستخدم السمة [] للإشارة إلى أن الطريقة مع هذه السمة هي نقطة الدخول.
المترجم و Visual Studio يحبوننا لهذا.
حتى في هذا المثال ، يجب أن تسمع أجراس الإنذار أو على الأقل بعض الشعور بسوء الفهم. لذلك ، قلنا أن هناك وظيفة أولية تأخذ مجموعة من أنواع السلسلة. كل ما أراه هو متغير باسم "argv" ، لا أرى أنه تم إعلانه كصفيف. من الواضح أن متغير "argv" هذا هو صفيف السلسلة الذي نتوقعه ، ولكن لماذا لا يحتوي على نوع .... ط ط ط ، مثيرة للاهتمام.
يحتوي F # على نظام جيد لاستنتاج الكتابة ، مما يعني أنه في كثير من الحالات ، يمكنك حذف النوع على الإطلاق ، وستقوم F # بإخراجه بشكل صحيح. بالطبع ، لا يزال بإمكانك التصريح الكامل بنوع متغير الإدخال إذا كنت تريد ، حيث عادة ما يستغرق النموذج
(variableName: variableType)لذلك ، بأخذ مثال "argv" أعلاه ، يمكننا بدلاً من ذلك الإعلان عن البرنامج أعلاه على النحو التالي ، وسيكون ذلك لطيفًا:
open System [<EntryPoint>] let main (argv :string[]) = printfn "Hello World" Console.ReadLine() |> ignore 0
كما ترى ، لقد حددنا بالكامل اسم متغير الإدخال بنوعه ، والذي في هذه الحالة هو مجموعة من السلسلة [].
ما المصالح الأخرى هناك؟ حسنًا ، كما قلت ، هناك شيء يمكن الحديث عنه.
لماذا لدي خط مع هذا الغريب
|> تجاهل في النهاية. ما هذا
حسنًا ، نظرًا لأن هذا تطبيق وحدة تحكم F # ، فقد أردت إيقاف تشغيل التطبيق حتى يقوم المستخدم بإدخال حرف. لذلك أنا بحاجة إلى القيام بأمرين:
- افتح مساحة الاسم "النظام" ، والتي تسمح لي باستخدام أنواع مساحة الاسم "النظام" ، كما لو كنت تستخدم "استخدام النظام" في C # أو "Imports System" في VB .NET. "
- نظرًا لأن F # لغة وظيفية ، فسوف تشتكي إذا كانت الوظيفة ، في هذه الحالة "Console.ReadLine (...)" ، والتي يمكنها إرجاع سلسلة ، لا تمرر النتيجة إلى وظيفة "تجاهل" ، والتي تعني فعليًا الإرجاع () (هذه هي الطريقة في F # يقول باطلا ، لكنه يطلق عليه وحدة). يخبر هذا صراحة F # بتجاهل نتيجة استدعاء الأسلوب Console.ReadLine (..).
على سبيل المثال ، إليك ما سيبدو عليه الرمز إذا قررت عدم تضمين |> التجاهل

قد لا يرى مبرمج C # / VB.NET ما يقال هنا. لكن F # صعبة للغاية بشأن ما يمكن أن تفعله الوظيفة ولا تستطيع القيام به. والشيء الوحيد الذي يجب أن تفعله الوظيفة دائمًا هو إرجاع النتيجة. في حالة الوظيفة "الرئيسية" ، ستكون النتيجة المتوقعة قيمة عددية 0.
ولكن ماذا عن حالة Console.ReadLine (..)؟
حسنًا ، على الأقل في هذه الحالة ، فإن النتيجة لا تهم كثيرًا ، ونحن لسنا مهتمين بها ، وسيظل البرنامج جيدًا إذا تخطينا
|> تجاهل ، ولكن إذا لم تكن مهتمًا بالفعل بالنتيجة ، يجب أن تتعلم استخدام
|> تجاهل . فقط إذا كنت مهتمًا ، فسيقوم مشغل خط الأنابيب "|>" بتوجيه قيمة الإرجاع للتعبير الأيسر إلى الوظيفة الصحيحة ، والتي في هذه الحالة تساوي
"قبول قيمة الإرجاع الخاصة بـ Console.Readline (...) وتجاهل كيف لا يهتم بها أحد .
" لا تقلق إذا كان هذا لا يعني أي شيء لك في هذه المرحلة ، سنتحدث أكثر عن هذا لاحقًا.
آخر شيء أحتاج إليه هو التأكد من أن دالة F # تُرجع دائمًا قيمة ، ويتم ذلك في السطر الذي ترى فيه السطر 0. هذا يكفي لـ F # لفهم أن هذه هي قيمة الإرجاع "0" ، والتي يقوم نظام استدلال الكتابة سيتم إخراج قيمة Int هذه من 0. السبب في معرفة المترجم F # أن هذه هي قيمة الإرجاع لأنها في هذه الحالة هي العبارة الأخيرة ، لذلك يجب أن تكون قيمة الإرجاع. من الواضح أن هذا يمكن أن يكون معقدًا باستخدام المنطق الشرطي إذا ، وإلا ، إلخ. من المهم ملاحظة أن الدالة F # يجب أن تُرجع دائمًا قيمة ، وفي هذه الحالة ، نظرًا لأن قيمة 0 Int كانت السلسلة الأخيرة التي تم العثور عليها (على الرغم من أن كل شيء قد يكون أكثر تعقيدًا) ، يتم استخدامه كقيمة الإرجاع. بالطبع ، يمكنك إرجاع الوحدة ، التي تتم باستخدام "()" ، والتي لا تُرجع شيئًا في الواقع (باطلة إذا كنت تريد).
شيء آخر أود أن أذكره في هذا المثال التافه هو أن المسافة البيضاء تلعب دورًا رئيسيًا في تطوير F #.
على سبيل المثال ، افترض أن المثال التافه الخاص بي بدا كما لو كان في محرر (في حالتي ، Visual Studio 2012):

هذا برنامج صغير ، وكل ما فعلته هو إزالة المسافات في بداية السطر printfn. Mmmm ، يبدو أن المترجم F # لم يعجبه على الإطلاق. نعم ، هذا عادل.
في F # ، تعد المساحة مهمة جدًا ، لذا العب بها جيدًا ، وإلا اعتدت على تصحيح الأخطاء المشفرة مثل تلك المبينة أعلاه ، والناجمة عن مشكلة بسيطة تتعلق بمساحة فاصلة غير صحيحة.
على أي حال ، هذا مثال على "Hello World". حتى نلتقي مرة أخرى في المرة القادمة ، أتمنى لكم كل التوفيق.