বেশিরভাগ রুটিন প্রোগ্রামিং কাজের জন্য হাস্কেলের উন্নত ধারণাগুলি মনডস এবং প্রয়োগমূলক ফ্যাক্টরগুলির মতো কতটা গুরুত্বপূর্ণ?


16

আমি শিখুন আপনি একটি হাস্কেল বইটি পড়েছেন যেখানে তারা মনডস এবং ঠিক একটি এর মতো স্টাফ প্রবর্তন করে। এগুলি আমার পক্ষে এতটা বিপরীতমুখী যে এটিকে শেখার চেষ্টা থেকে নিজেকে ছেড়ে দেওয়ার মতোই অনুভব করি।

তবে আমি সত্যিই চেষ্টা করতে চাই।

আমি ভাবছি যদি আমি কমপক্ষে কিছু সময়ের জন্য উন্নত ধারণাগুলি এড়াতে পারি এবং হাস্কেলের আরও বেসিক অংশগুলি, যেমন ফাংশনগুলি, স্ট্যান্ডার্ড আইও, ফাইল পরিচালনা, ডাটাবেস ইন্টারফেসিং এবং এর মতো।

হাসকলকে কীভাবে ব্যবহার করতে হয় তা শেখার পক্ষে কি এটি যুক্তিযুক্ত পদ্ধতি?


2
আমি জানি না আপনি কতদূর যাবেন। মোনাড ছাড়া আপনি হাস্কেল-তে কোনও কার্যকর কিছু করতে পারবেন না, যেহেতু প্রোগ্রামিংয়ে কিছু কার্যকর করার জন্য (যেমন একটি সিরিয়াস প্রোগ্রাম লিখতে হবে যে কেউ আসলে ব্যবহার করতে চায়) I / O এবং রাষ্ট্রের প্রয়োজন, উভয়ই কেবল হাস্কেলেই পরিচালনা করা যায় মনড ব্যবহারের মাধ্যমে।
ম্যাসন হুইলারের

1
@ লদন - শেষ পর্যন্ত আমি দুটি ডকুমেন্ট পড়ে হাস্কেল মনাদদের বুঝতে পেরেছি - "আপনি মোনাড উদ্ভাবন করতে পারতেন" এবং "দ্য অ্যাওয়ারওয়ার্ড স্কোয়াডকে মোকাবেলা করতে"। তারা "লার্ন ইউ এ হাস্কেল" এর চেয়ে ভাল কিনা তা আমি বলতে পারি না, যা আমি পড়িনি, তবে তারা আমার পক্ষে কাজ করেছিল। আইও মোনাডের সাথে ডোটেশনটি ব্যবহার করার জন্য, আপনি মনাদ কী কী তা খুব অল্প বুদ্ধি দিয়ে পেতে পারেন - আপনি এমন কিছু কাজ করবেন যা বিশেষজ্ঞদের হাসা বা কাঁদিয়ে তুলবে, তবে অন্ততপক্ষে, এটি ব্যবহার করা থেকে আলাদা নয় একটি প্রচলিত অপরিহার্য ভাষা। তবে কিছুটা গভীর বোঝাপড়া করা সার্থক।
স্টিভ 314

2
@ লাদেন, ওওপি-র বিরক্ত হতে এবং কার্যকরী ভাষা সম্পর্কে কৌতূহলী হতে শুরু করতে আমার প্রায় এক দশক লেগেছে। আমি হাসেলকে একটি গুরুতর চেষ্টা দেওয়ার আগে আমি এখনও এফ # এবং ক্লোজার শিখতে পারি। ব্যক্তিগত চ্যালেঞ্জগুলি দুর্দান্ত হলেও আপনার অন্ত্র অনুভূতি এবং ন্যূনতম প্রতিরোধের পথ সম্পর্কে কিছু বলা উচিত। আপনি কে তার উপর অনেক কিছু নির্ভর করে। আপনি যদি দৃ strongly়ভাবে গাণিতিক ধরণের হন তবে আপনি সম্ভবত শুরু থেকেই হাস্কেল / স্কেম পছন্দ করতে পারেন। আপনি যদি 'কাজটি সম্পন্ন করুন' ছেলেটির বেশি হন তবে এটি ঠিক আছে। 'ডু অর ডাই' মনোভাব নিয়ে হাস্কেলের কাছে যাবেন না। অন্যান্য জিনিস শিখুন, এবং বিরক্ত হলে ফিরে আসুন।
কাজ

@ জোব পরামর্শের জন্য ধন্যবাদ। আমি কিছুটা ক্লোজারের চেষ্টা করেছি, তবে লিডপ সিনট্যাক্স সত্যিই আমার পক্ষে কাজ করে না, পড়া এবং টাইপ উভয়ের জন্য। আমি হাস্কেলের সিনট্যাক্সটিকে আরও প্রাকৃতিক বলে মনে করি। এর মধ্যে আমি রুবিকে প্রকল্পগুলির জন্য ব্যবহার করে খুশি, তবে আমি আশা করি যে হাস্কেলের কিছু ব্যবহারিক প্রকল্প করা শুরু হবে।
ডান

@ উদ্যান, মজার, আমি ক্লোজারের বাক্য গঠনটি বরং বন্ধুত্বপূর্ণ দেখতে পাচ্ছি, তবে এটি সম্ভবত স্কিমের সংস্পর্শে এসেছিল বলেই। সম্ভবত এফ # এর পরে হাস্কেল যেভাবে জিনিসগুলি ব্যবহার করে সে সম্পর্কে অভ্যস্ত হয়ে যাব।
কাজ

উত্তর:


16

আসুন প্রথমে বিমূর্ত ধারণাটি শেখার এবং সেগুলির নির্দিষ্ট উদাহরণ শেখার মধ্যে পার্থক্য করি।

আপনি সমস্ত নির্দিষ্ট উদাহরণকে খুব বেশি উপেক্ষা করতে যাচ্ছেন না, সাধারণ কারণে যে তারা সম্পূর্ণরূপে সর্বব্যাপী। প্রকৃতপক্ষে, বিমূর্ততাগুলি বেশিরভাগ অংশে বিদ্যমান কারণ তারা নির্দিষ্ট উদাহরণগুলির সাহায্যে যেভাবেই করা হবে সেগুলি একত্রিত করে।

অন্যদিকে বিমূর্ততাগুলি অবশ্যই কার্যকরভাবে কার্যকর তবে এগুলি তাত্ক্ষণিকভাবে প্রয়োজনীয় নয়। আপনি পুরোপুরি পুরোপুরি বিমূর্তি উপেক্ষা করে এবং সরাসরি বিভিন্ন ধরণের সরাসরি ব্যবহার করতে পারেন। আপনি এগুলি অবশেষে বুঝতে চাইবেন, তবে আপনি পরে সর্বদা এটিতে ফিরে আসতে পারেন। প্রকৃতপক্ষে, আমি প্রায় গ্যারান্টি দিতে পারি যে আপনি যদি এটি করেন তবে আপনি যখন তা ফিরে পেয়েছেন তখন আপনি আপনার কপালটি চাপড়বেন এবং ভাববেন যে আপনি কেন সুবিধাজনক সাধারণ উদ্দেশ্যমূলক সরঞ্জামগুলি ব্যবহার না করে কঠোর উপায়ে সমস্ত সময় ব্যয় করেছিলেন।

Maybe aউদাহরণ হিসাবে নিন । এটি কেবল একটি ডেটা টাইপ:

data Maybe a = Just a | Nothing

এটি স্ব স্ব নথিপত্র ছাড়াও সব; এটি একটি alচ্ছিক মান। হয় আপনার কাছে "জাস্ট" কিছু টাইপ রয়েছে a, বা আপনার কাছে কিছুই নেই। বলুন আপনার কাছে কোনও ধরণের লুকের ফাংশন রয়েছে, যা উপস্থিত নাও হতে পারে এমন Maybe Stringএকটি Stringমান সন্ধান করার জন্য প্রত্যাবর্তন করে । সুতরাং আপনি মানটির সাথে মিল রেখে এটি দেখতে কোনটি:

case lookupFunc key of
    Just val -> ...
    Nothing  -> ...

এখানেই শেষ!

সত্যিই, আপনার প্রয়োজন মতো আর কিছুই নেই। কোন Functorএস বা Monadএস বা অন্য কিছু। এগুলি Maybe aমানগুলি ব্যবহার করার সাধারণ উপায়গুলি প্রকাশ করে ... তবে এগুলি কেবল "মূর্তিগুলি", "নকশার ধরণগুলি", আপনি যা কিছু বলতে চান তা।

আপনি যে জায়গাটি একেবারে এড়াতে পারবেন না তা সেই জায়গাটির সাথেই রয়েছে IOতবে এটি যেভাবেই রহস্যজনক ব্ল্যাক বক্স, তাই এটি কী Monadবা যা কিছু তা বোঝার চেষ্টা করার মতো নয় ।

আসলে, এখানে সব আপনার জন্য একটি ঠকাই শীট এর সত্যিই সম্পর্কে জানা প্রয়োজন IOএখন জন্য:

  • যদি কোনও কিছুর একটি প্রকার থাকে IO aতবে এর অর্থ এটি এমন একটি প্রক্রিয়া যা কিছু করে এবং একটি aমান ফেলে its

  • doস্বরলিপিটি ব্যবহার করে আপনার যখন কোনও ব্লকের কোড রয়েছে , তখন এই জাতীয় কিছু লেখা:

    do -- ...
       inp <- getLine
       -- etc...
    

    ... মানে ডানদিকের পদ্ধতিটি কার্যকর করা<- এবং ফলাফলটি বামদিকে নামের সাথে অর্পণ করা।

  • তবে আপনার যদি এরকম কিছু থাকে:

    do -- ...
       let x = [foo, bar]
       -- etc...
    

    ... এর অর্থ =বাম দিকের নামের সাথে ডানদিকে ডানদিকে সরল অভিব্যক্তির (কোনও প্রক্রিয়া নয়) মূল্য নির্ধারণ করা ।

  • আপনি যদি কোনও মান নির্দিষ্ট করে না দিয়ে কিছু রাখেন তবে:

    do putStrLn "blah blah, fishcakes"
    

    ... এর অর্থ একটি প্রক্রিয়া চালানো এবং যে কোনও কিছু ফিরে আসে তা উপেক্ষা করা। কিছু প্রক্রিয়া প্রকার থাকা IO ()--দী ()ধরনের একটি স্থানধারক যে কিছু বলে না সাজানোর, তাই যে শুধু পদ্ধতি মানে কিছু করে এবং একটি মান ফেরত দেয় না। voidঅন্যান্য ভাষায় কোনও ফাংশনের মতো বাছাই করুন ।

  • একই পদ্ধতি একাধিকবার কার্যকর করা বিভিন্ন ফলাফল দিতে পারে; এ ধরণের ধারণা। এ কারণেই কোনও IOমানটি থেকে "অপসারণ" করার কোনও উপায় নেই কারণ কোনও জিনিসের IOকোনও মূল্য নয়, এটি একটি মান পাওয়ার পদ্ধতি।

  • একটি doব্লকের শেষ লাইনটি অবশ্যই কোনও নির্ধারিত প্লেইন পদ্ধতি হতে হবে, যেখানে সেই পদ্ধতির রিটার্ন মান পুরো ব্লকের জন্য ফেরতের মান হয়ে যায়। আপনি যদি রিটার্নের মানটি ইতিমধ্যে নির্ধারিত কিছু মান ব্যবহার করতে চান তবে returnফাংশনটি একটি সরল মান নেয় এবং আপনাকে কোনও অপ-পদ্ধতি দেয় যা সেই মানটি ফেরত দেয়।

  • তা বাদে বিশেষ কিছু নেই IO; এই পদ্ধতিগুলি প্রকৃতপক্ষে নিজেরাই সরল মূল্য and এবং আপনি এগুলি চারপাশে পাস এবং বিভিন্ন উপায়ে তাদের একত্রিত করতে পারেন। এটি কেবল তখনই যখন তারা যে কোনও কিছু doকরে বলা হয় mainএমন কোনও ব্লকে মৃত্যুদন্ড কার্যকর করা হয় ।

সুতরাং, একেবারে বোরিং, স্টেরিওটাইপিকাল উদাহরণ প্রোগ্রামের মতো কিছুতে:

hello = do putStrLn "What's your name?"
           name <- getLine
           let msg = "Hi, " ++ name ++ "!"
           putStrLn msg
           return name

... আপনি এটি একটি আবশ্যক প্রোগ্রামের মতোই পড়তে পারেন। আমরা নামের একটি প্রক্রিয়া সংজ্ঞায়িত করছি hello। মৃত্যুদন্ড কার্যকর করা হলে, প্রথমে এটি আপনার নাম জিজ্ঞাসা করে একটি বার্তা মুদ্রণের জন্য একটি প্রক্রিয়া চালায়; এরপরে এটি এমন একটি প্রক্রিয়া চালায় যা ইনপুটটির একটি লাইন পড়ে এবং ফলাফল নির্ধারিত করে name; তারপরে এটি নামের সাথে একটি অভিব্যক্তি নির্ধারণ করে msg; তারপরে এটি বার্তাটি প্রিন্ট করে; তারপরে এটি পুরো ব্লকের ফলাফল হিসাবে ব্যবহারকারীর নাম দেয় returns যেহেতু nameএকটি String, এর অর্থ এই যে helloপ্রক্রিয়াটি একটি ফেরত দেয় String, তাই এর টাইপ থাকে IO String। এবং এখন আপনি এই প্রক্রিয়াটি অন্যরকমভাবে চালিত করতে পারেন ঠিক যেমন এটি কার্যকর করে getLine

পিএফএফ, মনডস। কার দরকার?


2
@ লাদান: আপনাকে খুব স্বাগতম! পথে যদি আপনার কোনও নির্দিষ্ট প্রশ্ন থাকে তবে স্ট্যাক ওভারফ্লোতে জিজ্ঞাসা করতে দ্বিধা করবেন না। সেখানে [হ্যাশেল] ট্যাগটি সাধারণত বেশ সক্রিয় থাকে এবং আপনি কোথায় থেকে লোকেরা আসছেন তা যদি আপনি ব্যাখ্যা করেন তবে কেবল ক্রিপ্টিক উত্তরগুলি টস না করে বোঝা অর্জনে সহায়তা করতে যথেষ্ট ভাল।
সিএ ম্যাকক্যান

9

বেশিরভাগ রুটিন প্রোগ্রামিং কাজের জন্য হাস্কেলের উন্নত ধারণাগুলি মনডস এবং প্রয়োগমূলক ফ্যাক্টরগুলির মতো কতটা গুরুত্বপূর্ণ?

এগুলি অপরিহার্য। এগুলি ব্যতীত, হাস্কেলকে অন্য একটি অপরিহার্য ভাষা হিসাবে ব্যবহার করা খুব সহজ, এবং যদিও সাইমন পাইটন জোনস একবার হাস্কেলকে "বিশ্বের সেরা অপরিহার্য প্রোগ্রামিং ভাষা" বলে অভিহিত করেছিলেন, আপনি এখনও সেরা অংশটি মিস করছেন।

মোনাডস, মোনাড ট্রান্সফর্মস, মনোয়েডস, ফ্যাক্টরস, অ্যাপ্লিকটিভ ফ্যাক্টর, কনট্র্যাভারেন্ট ফেন্টারস, অ্যারো, ক্যাটাগরিস ইত্যাদি নকশার নিদর্শন। আপনার তৈরির একটি নির্দিষ্ট জিনিসের সাথে আপনি তার মধ্যে একটি তৈরি করে ফেললে আপনি বিমূর্তভাবে লেখা ফাংশনগুলির একটি বিশাল ধনী আঁকতে সক্ষম হন। এই ধরণের শ্রেণিগুলি কেবল আপনাকে বিভ্রান্ত করার জন্য নয়, তারা আপনার জীবনকে আরও সহজ করার জন্য এবং আপনাকে আরও উত্পাদনশীল করার জন্য রয়েছে। তারা আমার মতে ভাল হাস্কেল কোডের সংক্ষিপ্ততার সবচেয়ে বড় কারণ reason


1
+1: "মনডস, মোনাড ট্রান্সফর্মস, মনোয়েডস, ফ্যাক্টরস, প্রয়োগমূলক ফ্যাক্টর, কনট্রভ্যারেন্ট ফ্যান্টেক্টর, তীর, বিভাগসমূহ, ইত্যাদি নকশার নিদর্শন বলে চিহ্নিত করার জন্য ধন্যবাদ"। !
জর্জিও

7

আপনি যদি কিছু চালাতে চান তবে এটি কি কঠোরভাবে প্রয়োজনীয়? না।

আপনি যদি সুন্দর আইডেম্যাটিক হাস্কেল প্রোগ্রাম লিখতে চান তবে এটি কি প্রয়োজনীয়? একেবারে।

হাস্কেলে প্রোগ্রামিং করার সময় এটি দুটি জিনিস মনে রাখতে সহায়তা করে:

  1. টাইপ সিস্টেমটি আপনাকে সাহায্য করার জন্য রয়েছে। যদি আপনি আপনার প্রোগ্রামটি বহুতল বহুপ্রকারের টাইপক্লাস-ভারী কোডের বাইরে রচনা করেন তবে খুব সহজেই আপনি দুর্দান্ত পরিস্থিতিতে যেতে পারেন যেখানে আপনি যে ধরণের ফাংশন চান তা (একক এক!) সঠিক প্রয়োগের জন্য আপনাকে গাইড করবে

  2. # 1 নীতি ব্যবহার করে বিভিন্ন উপলব্ধ গ্রন্থাগারগুলি তৈরি করা হয়েছিল।

সুতরাং হাসকেলে একটি প্রোগ্রাম লেখার সময় আমি প্রকারগুলি লিখে শুরু করি। তারপরে আমি আরও কিছু সাধারণ ধরণের শুরু করে লিখে রাখি (এবং যদি তারা বিদ্যমান টাইপক্লাসগুলির উদাহরণ হতে পারে তবে আরও ভাল)। তারপরে আমি কিছু ফাংশন লিখি যা আমাকে যে ধরণের পছন্দ করতে পারে তার মান দেয়। (তারপরে আমি তাদের সাথে খেলি ghciএবং সম্ভবত কিছু দ্রুত চেক পরীক্ষা লিখি)) এবং শেষ পর্যন্ত আমি এগুলি একসাথে আঠালো করি main

কুরুচিপূর্ণ হাস্কেল লেখা সম্ভব যা কিছু চালিয়ে যায়। আপনি একবার এই পর্যায়ে পৌঁছেছেন তবে শিখতে আরও অনেক কিছু আছে।

শুভকামনা!


1
ধন্যবাদ! আমি ক্লোজুরে এবং হাস্কেলের মধ্যে বিচরণ করছিলাম, তবে এখন আপনার মতো লোকেরা কতটা সহায়ক হয়েছে সে কারণে আমি হাস্কেলের দিকে ঝুঁকছি।
দান

1
হাস্কেল সম্প্রদায়টি খুব সুন্দর এবং সহায়ক বলে মনে হচ্ছে। এবং দেখে মনে হচ্ছে অনেক আকর্ষণীয় ধারণা এসেছে
জাচারি কে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.