রেকর্ড হলো একসাথে থাকা কিছু ফিল্ডের (যেগুলো ভিন্ন ভিন্ন টাইপের হতে পারে) একটি সংগ্রহ। একটি রেকর্ড ডিফাইন করতে type কিওয়ার্ডটি ব্যবহার করা হয়। রেকর্ডের ফিল্ডগুলো { আর } অক্ষরের মাঝে ডিফাইন করা হয়, এবং প্রতিটি ফিল্ডের একটি নাম এবং একটি টাইপ থাকে। একটি রেকর্ড তৈরি করতে, ফিল্ডগুলোর নাম উল্লেখ করে { আর } অক্ষরের মাঝে সেগুলোতে একটি মান অ্যাসাইন করতে হয়। রেকর্ড তৈরি করার সময় সব ফিল্ডেই একটি মান অ্যাসাইন করতে হবে। ডট-নোটেশন ব্যবহার করে একটি রেকর্ড ইনস্ট্যান্সের ফিল্ডের মান অ্যাক্সেস করা যায়।
একটি রেকর্ড ডিফাইন বা তৈরি করার সময় প্রতিটি ফিল্ড হয় আলাদা লাইনে থাকতে হবে, নয়তো একই লাইনে থাকলে সেমিকোলন (;) দিয়ে আলাদা করতে হবে।
// Define a record
type Address =
{ Street: string
HouseNumber: int }
// Create a record
let oldAddress: Address =
{ Street = "Main Street"
HouseNumber = 17 }
// Single-line alternative
type ConciseAddress = { Street: string; HouseNumber: int }
let conciseAddress: ConciseAddress = { Street = "Main Street"; HouseNumber = 17 }
যেহেতু রেকর্ড ইমিউটেবল, তাই একবার একটি রেকর্ড তৈরি হয়ে গেলে তার ফিল্ডের মান আর কখনো বদলানো যায় না। আপনি যদি একটি রেকর্ডের মান বদলাতে চান, তাহলে with কিওয়ার্ডটি দিয়ে বিদ্যমান রেকর্ডের একটি কপি তৈরি করতে পারেন, তবে এক বা একাধিক ফিল্ডের নতুন মান দিয়ে।
// Copy the old address but change the house number
let newAddress: Address = { oldAddress with HouseNumber = 86 }
newAddress.Street // => "Main Street"
newAddress.HouseNumber // => 86
রেকর্ডে স্ট্রাকচারাল ইকুয়ালিটি থাকে, যার মানে একই রেকর্ডের একই মানের দুটি ইনস্ট্যান্স সমতুল্য।
ডট-নোটেশন দিয়ে রেকর্ডের ফিল্ড অ্যাক্সেস করা ছাড়াও, রেকর্ডকে বাইন্ডিং এবং প্যাটার্ন ম্যাচিংয়ে ডিকনস্ট্রাক্ট করা যায়:
let myAddress: Address = { Street = "Broadway"; HouseNumber = 123 }
let { Street = myStreet; HouseNumber = myHouseNumber } = myAddress
match myAddress with
| { HouseNumber = 1 } -> printfn "First house"
| { HouseNumber = houseNumber; Street = street } -> printfn "House number %d on %s" houseNumber street
// => "House number 123 on Broadway
এই অনুশীলনীতে আপনি একজন বড় ক্রীড়াপ্রেমী এবং NBA বাস্কেটবলের প্রতি সদ্য আকৃষ্ট হয়েছেন। NBA বাস্কেটবলে নতুন হওয়ায়, আপনি NBA-এর ইতিহাসে গভীরভাবে ডুব দিচ্ছেন, দল, কোচ, তাদের জয়/পরাজয়ের পরিসংখ্যান ট্র্যাক করছেন এবং তাদের একে অপরের সাথে তুলনা করছেন।
যেহেতু আপনার এখনও প্রিয় কোনো দল নেই, আপনি একটি অ্যালগরিদমও তৈরি করবেন যা নির্ধারণ করবে যে কোনো নির্দিষ্ট দলকে সমর্থন করবেন কিনা।
আপনার নিজস্ব দল-সমর্থনের অ্যালগরিদম তৈরি করতে সাতটি কাজ রয়েছে।
নিম্নলিখিত দুটি ফিল্ড সহ Coach রেকর্ড ডিফাইন করুন:
Name: কোচের নাম, টাইপ string.FormerPlayer: কোচ পূর্বে খেলোয়াড় ছিলেন কিনা তা নির্দেশ করে, টাইপ bool.নিম্নলিখিত দুটি ফিল্ড সহ Stats রেকর্ড ডিফাইন করুন:
Wins: জয়ের সংখ্যা, টাইপ int.Losses: পরাজয়ের সংখ্যা, টাইপ int.নিম্নলিখিত তিনটি ফিল্ড সহ Team রেকর্ড ডিফাইন করুন:
Name: দলের নাম, টাইপ string.Coach: দলের কোচ, টাইপ Coach.Stats: দলের পরিসংখ্যান, টাইপ Stats.createCoach ফাংশনটি ইমপ্লিমেন্ট করুন যা প্যারামিটার হিসেবে কোচের নাম এবং তার পূর্বে খেলোয়াড় থাকার স্ট্যাটাস নেয়, এবং তার Coach রেকর্ড রিটার্ন করে:
createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }
createStats ফাংশনটি ইমপ্লিমেন্ট করুন যা প্যারামিটার হিসেবে জয়ের সংখ্যা এবং পরাজয়ের সংখ্যা নেয়, এবং তার Stats রেকর্ড রিটার্ন করে:
createStats 58 24
// => { Wins = 58; Losses = 24 }
createTeam ফাংশনটি ইমপ্লিমেন্ট করুন যা প্যারামিটার হিসেবে দলের নাম, কোচ এবং রেকর্ড নেয়, এবং তার Team রেকর্ড রিটার্ন করে:
let coach = createCoach "Larry Bird" true
let record = createStats 58 24
createTeam "Indiana Pacers" coach record
// => { Name = "Indiana Pacers"
// Coach = { Name = "Larry Bird"; FormerPlayer = true }
// Stats = { Wins = 58; Losses = 24 } }
NBA মালিকরা অধৈর্য হয়ে পড়ায়, আপনি দেখলেন যে খারাপ দলীয় ফলাফলের কারণে প্রায়শই কোচ পরিবর্তন করতে হয়। replaceCoach ফাংশনটি ইমপ্লিমেন্ট করুন যা প্যারামিটার হিসেবে দল এবং তার নতুন কোচ নেয়, এবং নতুন কোচসহ দলটি রিটার্ন করে:
let coach = createCoach "Larry Bird" true
let record = createStats 58 24
let team = createTeam "Indiana Pacers" coach record
let newCoach = createCoach "Isiah Thomas" true
replaceCoach team newCoach
// => { Name = "Indiana Pacers"
// Coach = { Name = "Isiah Thomas"; FormerPlayer = true }
// Stats = { Wins = 58; Losses = 24 } }
পরিসংখ্যান খতিয়ে দেখার সময়, আপনি দল এবং তাদের রেকর্ডের তালিকা রাখছেন। মাঝে মাঝে আপনি ভুল করেন এবং আপনার তালিকায় ডুপ্লিকেট এন্ট্রি থাকে। isSameTeam ফাংশনটি ইমপ্লিমেন্ট করুন যা দুটি দল নেয় এবং যদি তারা একই দল হয় তবে true রিটার্ন করে; অন্যথায় false রিটার্ন করে:
let pacersCoach = createCoach "Larry Bird" true
let pacersStats = createStats 58 24
let pacersTeam = createTeam "Indiana Pacers" pacersCoach pacersStats
let lakersCoach = createCoach "Del Harris" false
let lakersStats = createStats 61 21
let lakersTeam = createTeam "LA Lakers" lakersCoach lakersStats
isSameTeam pacersTeam lakersTeam
// => false
অনেক দল ও ম্যাচ দেখার পর, আপনি একটি অ্যালগরিদম বের করেছেন। নিম্নলিখিতগুলোর মধ্যে একটি সত্য হলে, আপনি সেই দলকে সমর্থন করবেন:
rootForTeam ফাংশনটি ইমপ্লিমেন্ট করুন যা একটি দল নেয় এবং যদি আপনার সেই দলকে সমর্থন করা উচিত হয় তবে true রিটার্ন করে; অন্যথায় return false:
let spursCoach = createCoach "Gregg Popovich" false
let spursStats = createStats 56 26
let spursTeam = createTeam "San Antonio Spurs" spursCoach spursStats
rootForTeam spursTeam
// => true
Exercism-এ সাইন আপ করুন, F# ট্র্যাকের 18টি কনসেপ্ট148টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।