تناولنا تصدير الدوال في المفهوم الأول، وهذه مراجعة سريعة.
كل ملف في Elm هو وحدة، ويجب أن يحتوي على عبارة module قبل أي كود آخر.
يجب أن تطابق أسماء الوحدات أسماء ملفاتها، فوحدة Calculator يجب أن تكون في الملف Calculator.elm، ووحدة Parser.Utils يجب أن تكون في الملف Parser/Utils.elm.
أي شيء يُعرَّف داخل وحدة يكون نطاقه خاصًّا بها ولا يمكن الوصول إليه من خارجها، إلا إذا كان مُدرجًا في exposing.
-- Calculator.elm
-- Define the Calculator module, and expose the `add` function
module Calculator exposing (add)
six = 3 + 3
add number1 number2 = number1 + number2
-- Calculator.elm
-- Define the Calculator module, and expose everything within: `six` and `add`
module Calculator exposing (..)
six = 3 + 3
add number1 number2 = number1 + number2
https://elm-lang.org/docs/syntax#modules
يتم الوصول إلى الدوال المعرَّفة في وحدات أخرى عبر الاستيرادات. عند استيراد وحدة ما، تصبح كل الدوال التي أتاحتها تلك الوحدة متاحة للوصول. لكن طريقة الوصول إليها تختلف حسب طريقة استيراد الوحدة.
الاستيراد المؤهَّل هو الوضع الافتراضي، ويتم الوصول إلى دالة داخل وحدة كهذه (مثل دالة map في وحدة List) بوضع اسم الوحدة قبلها (List.map).
أما الاستيراد المفتوح فيتيح الوصول المباشر إلى الدوال المتاحة داخل تلك الوحدة، دون إضافة بادئة. ويتم ذلك بالكلمة المفتاحية exposing، تمامًا كما في التصدير. يمكنك إتاحة جميع الدوال (باستخدام ..)، أو إتاحة دوال بعينها (مثل map).
يمكنك أيضًا استيراد الأنواع ومُنشِئاتها من وحدات أخرى، وهو ما سنتناوله في مفهوم لاحق.
ويُفضَّل الاستيراد المؤهَّل لما يوفره من وضوح ولتجنّب تعارض الأسماء.
-- qualified imports
import List -- List.map, List.foldl
import List as L -- L.map, L.foldl
-- open imports
import List exposing (..) -- map, foldl, concat, ...
import List exposing ( map, foldl ) -- map, foldl, List.concat
https://elm-lang.org/docs/syntax#modules
تُعرَّف توصيفات النوع بالصيغة name : parameter types -> return type، مع فصل أنواع المعاملات أيضًا بـ ->.
add : Int -> Int -> Int
add number1 number2 = number1 + number2
يمكن استخدام الأقواس الهلالية لتعريف معاملات الدالة (وهي نفسها تُعرَّف بالصيغة ذاتها، ومن هنا تأتي الحاجة إلى الأقواس).
-- Transform every character in a string
map : (Char -> Char) -> String -> String
map charMapperFunction string =
-- ...
https://elm-lang.org/docs/syntax#type-annotations
يتوفر في Elm نوعان من الأعداد، يُعرَّفان بالنوعين Int و Float.
يقابل Int مجموعة الأعداد الصحيحة الموجبة والسالبة.
ويقابل Float مجموعة الأعداد الحقيقية، محدودةً بدقة الحاسوب.
العمليات المعرَّفة على الأعداد تعمل عادةً على أحد النوعين، دون خلط بينهما.
وتوجد دوال للتحويل بين النوعين، مثل toFloat الذي يحوّل Int إلى Float، وround وfloor وceiling وtruncate التي تحوّل Float إلى Int بدلالات مختلفة.
https://package.elm-lang.org/packages/elm/core/latest/Basics#Int
لوصف الكلمات والجمل في الكود، يمتلك Elm نوعًا أصليًّا هو String.
تُكتب السلاسل النصية الحرفية بين علامتي اقتباس مزدوجتين، مثل "Hello World!".
ويتوفر افتراضيًّا عامل دمج السلاسل النصية ++ وعامل التساوي ==.
hello : String -> String
hello subject = "Hello " ++ subject
hello "World!" --> "Hello World!"
معظم دوال السلاسل النصية الأخرى موجودة في وحدة String، التي تحتاج إلى استيراد.
https://package.elm-lang.org/packages/elm/core/latest/String
في هذا التمرين، ستكتب بعض الكود لمساعدة Betty's Bike Shop، وهو متجر إلكتروني للدراجات وقطع الغيار. لديك ثلاث مهام، هدفها عرض أسعار الدراجات وقطع الغيار بشكل صحيح على الموقع.
penceToPounds
لقد كتب زميلك بالفعل هيكل الوحدة، وهما الدالتان غير المعرَّفتين penceToPounds وpoundsToString.
لكنه نسي تصدير دالة penceToPounds، لذا فهي غير مرئية حاليًا للوحدات الأخرى ولا لمجموعة الاختبارات.
أضف penceToPounds إلى قائمة الدوال المصدَّرة.
حاليًا، يُخزَّن السعر على هيئة عدد صحيح من البنسات (متجر الدراجات موجود في المملكة المتحدة).
على الموقع، نريد عرض السعر بالـجنيهات، حيث يساوي 1.00 جنيه 100 بنس.
مهمتك الثانية هي تنفيذ دالة penceToPounds، التي تأخذ مقدارًا من البنسات من نوع Int، وتحوّله إلى ما يعادله من الجنيهات على هيئة Float.
وينبغي لك أيضًا تعريف تعليق النوع لتلك الدالة.
penceToPounds 106
--> 1.06
بما أن دراجات Betty's Bike Shop تُباع بالجنيهات، ينبغي عرض الأسعار مع الرمز "£".
مهمتك الثالثة إذن هي تنفيذ دالة poundsToString، التي تأخذ مبلغًا بالجنيهات من نوع Float وتُرجع سعره معروضًا على هيئة String مع إضافة رمز الجنيه في بدايته.
تحتوي وحدة String على الدالة String.fromFloat التي ستساعدك في ذلك.
عليك استيراد وحدة String قبل استخدامها.
وينبغي لك أيضًا تعريف تعليق النوع للدالة poundsToString.
poundsToString 1.06
--> "£1.06"
سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.