نكتب "مرحبا ، العالم!" تطبيق ويب هاسكل (سبوك)

شعرت بالملل من الكتابة في بيثون ، أردت شيئًا غير عادي. قررت أن أجرب هاسكل. لا أعرف اللغة ، لكنني لا أريد أن أكتب برامج تدريب على وحدة التحكم ، مثل حساب العوامل. بعد دراسة عدد كبير إلى حد ما من المنشورات حول هاسكل وتطبيقه في الحياة الواقعية ، أدركت أن واحدة من النقاط المحتملة لنمو شعبية اللغة هي كتابة تطبيقات الويب. الغريب ، هناك عدد لا بأس به من الأطر على شبكة الإنترنت تحت هاسكل. وقع اختياري على Spock ، لأنه ، وفقًا للوصف ، فهو إطار بسيط وسريع للتطوير. لدي بعض الخبرة في كتابة تطبيقات الويب في Flask ، لذلك اعتقدت أنه سيكون من المثير للاهتمام مقارنة هذه الأساليب المتباينة في حل المشكلات المماثلة. في المقالة ، سأحاول إعطاء أكثر الطرق تفصيليًا للتجربة والخطأ في دراسة Haskell باستخدام مثال كتابة أبسط تطبيق ويب Spock. ربما يكون هذا مفيدًا لأولئك الذين يشككون في محاولة دراسة هاسكل وما إذا كان ذلك مفيدًا في الحياة الحقيقية.


قليلا عن هاسكل وكيفية طبخها


أول ما يواجهه كل مطور عند تعلم لغة جديدة هو اختيار بيئة التطوير وإعدادها. بالطبع ، يمكنك الكتابة في دفتر ملاحظات ، ولكن إذا كان لديك بعض الخبرة على الأقل في تطوير مشاريع الإنتاج ، فإن هذه الطريقة ستسبب لك الألم. بالمناسبة ، Haskell هي لغة قديمة ومشتركة للغاية ولديها دعم لمعظم المحررين والمشاهير. صديقي هاسكيليست يستخدم إيماكس. أنا معتاد على IDE العادي ، لذلك قمت بتثبيت البرنامج المساعد لبرنامج IntelliJ.


أيضًا ، من أجل التطوير ، فأنت بحاجة إلى مكدس ، وهو الآن المعيار الذي يجمع بين المترجم ونظام إدارة الحزمة ونظام إنشاء واختبار.


كل شيء يبدو لطيفا ، لم تكن هناك مشاكل مع التثبيت. لأغراض التطوير ، أستخدم Mac OS ، ولم أختبره على أنظمة أخرى ، لكنني أظن أنه في ظل نظام Linux ، سيبدأ كل شيء دون مشاكل أيضًا.


مرحبا العالم!


تدريب


نذهب إلى البرنامج التعليمي ونحاول القيام بكل شيء وفقًا للتعليمات. هناك يقترحون أولاً إنشاء مشروع قياسي من خلال المكدس: stack new MyLovelyProlect . المشروع القياسي هو مجلد يحتوي على ثلاثة مجلدات فرعية: app ، src ، test . يبدو منطقيًا جدًا: مجلد واحد للتطبيق الرئيسي ، ومجلد للوظائف الإضافية ، والمجلد الثالث للاختبار. نظرًا لأننا نكتب "Hello، world!" ، فنحن لا نحتاج إلى src test المجلدات ، لكننا لسنا بحاجة إلى حذفها ، لأنه وإلا فسيتعين علينا تنظيف الملفات الأخرى بعناية ، على سبيل المثال ، HelloWorld.cabal .


في الواقع ، رمز


كذلك في البرنامج التعليمي ، يُقترح نسخ بعض الأكواد في Main.hs سنعمل على تبسيط الأمر قليلاً مقارنة بما تقدمه القارورة.


 {-# LANGUAGE OverloadedStrings #-} module Main where import Web.Spock import Web.Spock.Config app :: SpockM () () () () app = get root $ text "Hello World!" main :: IO () main = do cfg <- defaultSpockCfg () PCNoDatabase () let mw = spock cfg app runSpock 8080 mw 

للمقارنة ، سأقدم نفس الكود في قارورة:


 from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" app.run() 

حسب عدد الأسطر ، لا تزال القارورة تفوز: 8 مقابل 13. لكن بالنظر إلى أن لغة هاسكل هي لغة مكتوبة بشكل ثابت وأن سطرين يشغلان تحديد الكتابة ، فإن الفرق ، في رأيي ، صغير. على الأقل الكود أعلاه لم يخيفني من مواصلة تعلم اللغة.


التجمع والانطلاق


بعد ذلك ، انتقل إلى HelloWorld.cabal وأضف executable HelloWorld-exe إلى القسم الذي build-depends: Spock >=0.13 build-depends: line Spock >=0.13 . في البرنامج التعليمي على الموقع ، يُقترح تضمين اثنين من التبعيات الأخرى ، ولكن لأغراضي ليست هناك حاجة إلى ذلك. إذا حاولنا الآن إنشاء التطبيق باستخدام stack build --fast --pedantic ، stack build --fast --pedantic نحصل على الخطأ التالي:


 Error: While constructing the build plan, the following exceptions were encountered: In the dependencies for HelloWorld-0.1.0.0: Spock must match >=0.13, but the stack configuration has no specified version (latest matching version is 0.13.0.0) needed since HelloWorld is a build target. Some different approaches to resolving this: * Consider trying 'stack solver', which uses the cabal-install solver to attempt to find some working build configuration. This can be convenient when dealing with many complicated constraint errors, but results may be unpredictable. * Recommended action: try adding the following to your extra-deps in /Users/dkvasov/Documents/Haskell/Spock/HelloWorld/stack.yaml: Spock-0.13.0.0@sha256:8115862eb4fb84a26fb7bcd34f30acf036bd2e7c4eaf813c185c5562d138bba2 Plan construction failed. 

الأمر واضح جدًا: المكدس لا يعرف إصدار Spock الذي يجب تثبيته ، لذلك يجب كتابته في ملف stack.yaml . أضف extra-deps وحاول البناء مرة أخرى. ستظهر بعض الأخطاء الأخرى المشابهة ، ونتيجة لذلك ، في ملف stack.yaml ، حصلت على ما يلي:


 extra-deps: - Spock-0.13.0.0 - Spock-core-0.13.0.0 - reroute-0.5.0.0 - stm-containers-0.2.16 - focus-0.1.5.2 

بعد ذلك ، تجمع كل شيء. كانت مجموعة الأعمال الفنية الخاصة بك موجودة في .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build .


بدأ كل شيء باستخدام stack exec HelloWorld-exe الأوامر stack exec HelloWorld-exe ، وعلى localhost:8080 رأيت الترحيب "Hello، world!". لا حاجة للرقص مع الدف.


نحن نحاول معرفة ما يجري.


حتى الآن ، لم نستخدم أي معرفة محددة بالبرمجة الوظيفية (FP) ولغة هاسكل. استخدمنا الحس السليم والمعرفة بأساسيات التنمية. لا يمكنك فعل ذلك أكثر. لمزيد من الفهم ، نحن بحاجة إلى معرفة بعض الأشياء عن AF. AF ليس antipode من OOP. يعرف أولئك الذين يعرفون لغة Scala أن كلا المفهومين يتعايشان بسهولة. antipode من FP هو البرمجة الحتمية. في حين يعتمد النموذج الوظيفي للحسابات على تكوين الوظائف ، يعتمد النموذج الضروري على عملية التغييرات المتتالية في حالات النظام. ويترتب على ذلك أنه بلغات وظيفية بحتة مثل هاسكل ، يُفترض أن الدالات "نقية" ، أي أنها لا تحتوي على حالة قابلة للتغيير و "آثار جانبية" ، بالإضافة إلى قيمة الإرجاع. هذا يجعل من السهل بناء التراكيب الميزة. في الواقع ، يفرض شرط "النقاء" العديد من القيود على استخدام اللغات الوظيفية في العالم الحقيقي. ومع ذلك ، نظرًا لوجود تطبيقات إنتاج على Haskell ، فلا يزال بإمكانك استخدام الوظائف الخالصة بطريقة ما في العالم الحقيقي. دعونا نلقي نظرة فاحصة على Main.hs لدينا


كما أفهمها ، فإن تطبيق app هو متغير من النوع SpockM ، وهو SpockM . على الأرجح ، إذا لم تكن على دراية بالأسلوب الوظيفي للبرمجة ونظرية الفئات ، فلن تفهم في المرة الأولى ما هو عليه ولماذا تحتاجه. ومع ذلك ، من الضروري التعامل مع هذا على الأقل على المستوى الأساسي ، لأن الموناديات هي أساس تطبيق لغة هاسكل. هناك عدد قليل من المقالات بدرجات متفاوتة من التفاصيل حول هذا الموضوع ، بما في ذلك على Habré. بالطبع ، لن أحضرهم إلى هنا. حتى الآن ، أقترح التفكير في أن هذه الأحجار السحرية هي التي تتيح لك إنتاج ما يسمى الآثار الجانبية. هناك monad آخر في طلبنا: IO . تأثيره الجانبي هو إدخال / إخراج البيانات.


SpockM معلمة من قبل أربعة أنواع أخرى. وهي تتوافق مع اتصال قاعدة البيانات والدورة والحالة وقيمة الإرجاع. بالنسبة للتطبيق الفارغ ، ليس هناك حاجة إلى أي من ذلك ، لذلك سنستخدم دائمًا النوع () ، والذي يسمى الوحدة. داخل app نربط مسارات الإجراءات. في هذه الحالة ، حددنا المسار الأساسي / وسأرجع الإجراء "Hello, world! get- .


بعد ذلك ، نقوم بإنشاء التكوين الافتراضي وتعيينه إلى cfg . بعد ذلك ، باستخدام وظيفة spock بإنشاء برنامج spock للتطبيق و cfg ونقله إلى runSpock مع منفذ الإطلاق المطلوب.


استنتاج


من الواضح أن كل شيء موصوف هنا بسيط للغاية ، وسيكون كل من يتحدث الإنجليزية ومجهزًا للعقل قادرًا على فعل نفس الشيء من خلال النظر في البرنامج التعليمي الأولي. كان هذا المقال يتعلق بكيفية التعرف على لغة هاسكل. ما التالي؟ علاوة على ذلك ، تقترح جميع موارد التعلم تقريبًا استخدام الحالة وكتابة تطبيق ما يجب عمله ، ثم توصيل قاعدة البيانات ، ثم ... ربما سأكتب في المستقبل تكملة.


مراجع


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


All Articles