ফাংশন এক্সপোর্ট করা প্রথম কনসেপ্টে আলোচনা করা হয়েছে, এখানে একটি দ্রুত পুনরালোচনা রইল।
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
অন্য মডিউলে ডিফাইন করা ফাংশন অ্যাক্সেস করা হয় ইমপোর্টের মাধ্যমে। ওই মডিউলটি ইমপোর্ট করলে তার মধ্যে যে ফাংশনগুলো এক্সপোজ করা হয়েছে, সেগুলো সব অ্যাক্সেসযোগ্য হয়ে যায়। তবে সেগুলো কীভাবে অ্যাক্সেস করা হবে, তা নির্ভর করে মডিউলটি কীভাবে ইমপোর্ট করা হয়েছে তার উপর।
কোয়ালিফাইড ইমপোর্ট হলো ডিফল্ট, আর এমন মডিউলের ভেতরের একটি ফাংশন (যেমন List মডিউলের map ফাংশন) অ্যাক্সেস করা হয় মডিউলের নাম আগে বসিয়ে (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 যোগ করুন।
বর্তমানে, দামটি পেন্সের একটি ইন্টিজার সংখ্যা হিসেবে সংরক্ষিত থাকে (বাইকের দোকানটি যুক্তরাজ্যে অবস্থিত)। ওয়েবসাইটে আমরা দামটি পাউন্ডে দেখাতে চাই, যেখানে ১.০০ পাউন্ড সমান ১০০ পেন্স।
আপনার দ্বিতীয় কাজ হলো penceToPounds ফাংশনটি ইমপ্লিমেন্ট করা, যা Int টাইপের পেন্সের পরিমাণ নেয় এবং সেটিকে সমতুল্য পাউন্ডে Float হিসেবে রূপান্তর করে। আপনার সেই ফাংশনের জন্য টাইপ অ্যানোটেশনও ডিফাইন করা উচিত।
penceToPounds 106
--> 1.06
যেহেতু Betty's bikes পাউন্ডে বিক্রি হয়, দামগুলো "£" চিহ্নসহ প্রদর্শন করা উচিত। সুতরাং আপনার তৃতীয় কাজ হলো poundsToString ফাংশনটি ইমপ্লিমেন্ট করা, যা পাউন্ডের পরিমাণ একটি Float হিসেবে নেয় এবং এর দামের আগে পাউন্ড চিহ্ন বসিয়ে সেটিকে একটি String হিসেবে রিটার্ন করে। String মডিউলে String.fromFloat ফাংশনটি আছে, যা এ কাজে সহায়ক হবে। ব্যবহার করার আগে String মডিউলটি ইমপোর্ট করা উচিত। আপনার poundsToString ফাংশনের জন্যও টাইপ অ্যানোটেশন ডিফাইন করা উচিত।
poundsToString 1.06
--> "£1.06"
Exercism-এ সাইন আপ করুন, Elm ট্র্যাকের 28টি কনসেপ্ট110টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।