F # 1: مرحبا العالم

هذا النص هو ترجمة مجانية لسلسلة من المقالات ساشا باربر من برايتون ، المملكة المتحدة التي وجدت مثيرة للاهتمام بما فيه الكفاية.

هذه هي المشاركة الأولى في سلسلة 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 # ، فقد أردت إيقاف تشغيل التطبيق حتى يقوم المستخدم بإدخال حرف. لذلك أنا بحاجة إلى القيام بأمرين:

  1. افتح مساحة الاسم "النظام" ، والتي تسمح لي باستخدام أنواع مساحة الاسم "النظام" ، كما لو كنت تستخدم "استخدام النظام" في C # أو "Imports System" في VB .NET. "
  2. نظرًا لأن 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". حتى نلتقي مرة أخرى في المرة القادمة ، أتمنى لكم كل التوفيق.

Source: https://habr.com/ru/post/ar470003/


All Articles