হাস্কেল বড় আকারের নকশা? [বন্ধ]


565

বড় ফাংশনাল প্রোগ্রামগুলি বিশেষত হাস্কেলের ডিজাইন / কাঠামো গঠনের একটি ভাল উপায় কী?

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

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

বৃহত্তর অবজেক্ট-ভিত্তিক অত্যাবশ্যক প্রোগ্রামগুলির জন্য এই প্রশ্নগুলিকে সম্বোধন করার জন্য যথেষ্ট বড় একটি সাহিত্য রয়েছে। এমভিসি, নকশার প্যাটার্ন ইত্যাদির মতো আইডিয়াগুলি ও ও স্টাইলে উদ্বেগের পৃথকীকরণ এবং পুনঃব্যবহারযোগ্যতার মতো বিস্তৃত লক্ষ্যগুলি উপলব্ধি করার জন্য সুনির্দিষ্ট প্রেসক্রিপশন। অধিকন্তু, নতুন জোরালো ভাষাগুলি নিজেকে 'বাড়ার সাথে সাথে ডিজাইনের' শৈলীর পুনঃনির্মাণের শৈলীতে ndণ দেয় যা আমার অবিশ্বাস্য মতে হাস্কেল কম কম উপযুক্ত বলে মনে হয়।

হাস্কেলের জন্য কি সমমানের সাহিত্য আছে? বিদেশী নিয়ন্ত্রণ কাঠামোর চিড়িয়াখানা কীভাবে কার্যকরী প্রোগ্রামিংয়ে উপলব্ধ (মনড, তীর, প্রয়োগমূলক ইত্যাদি) এই উদ্দেশ্যে সর্বাধিক নিযুক্ত হয়? আপনি কোন সেরা অনুশীলনের সুপারিশ করতে পারেন?

ধন্যবাদ!

সম্পাদনা (এটি ডন স্টুয়ার্টের উত্তরের অনুসরণ):

@ ডনস উল্লেখ করেছেন: "মনডগুলি মূল স্থাপত্য নকশাগুলি ক্যাপচার করে" "

আমার অনুমান আমার প্রশ্ন: খাঁটি কার্যকরী ভাষায় কী কী মূল স্থাপত্য নকশাগুলি সম্পর্কে ভাবা উচিত?

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

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

তিনি যে স্লাইডগুলি সংযুক্ত করেছেন সেগুলির একটি জিনিস রয়েছে যা আমাদের বুলেট দরকার: "প্রকার / ফাংশন / শ্রেণি / মনডে নকশা ম্যাপ করার জন্য আইডিয়ামস"। মূর্খতা কি? :)


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

18
@ চাওস কিন্তু কেবল হাস্কেল ডিফল্টরূপে রাষ্ট্রহীনতা প্রয়োগ করেছেন। আপনার কোনও বিকল্প নেই, এবং হাস্কেল :
ডন স্টুয়ার্ট

7
@ চাওসপ্যান্ডিয়ন: তাত্ত্বিকভাবে আমি একমত নই। অবশ্যই, একটি অপরিহার্য ভাষায় (বা বার্তা প্রেরণের চারপাশে নকশাকৃত একটি কার্যকরী ভাষায়), সম্ভবত আমি যা করব তা খুব ভাল। তবে রাষ্ট্রকে মোকাবেলা করার জন্য হাস্কেলের অন্যান্য উপায় রয়েছে এবং সম্ভবত তারা আমাকে আরও 'খাঁটি' সুবিধা বজায় রাখতে দেয়।
ড্যান

1
আমি এই নথিতে "নকশা নির্দেশিকা" এর অধীনে এ সম্পর্কে কিছুটা লিখেছিলাম: community.haskell.org/~ndm/downloads/…
নীল মিশেল

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

উত্তর:


519

আমি এই সম্পর্কে একটু কথা মধ্যে Haskell প্রকৌশল বড় বড় প্রকল্পের এবং ডিজাইন এবং XMonad বাস্তবায়নের। বৃহত ইঞ্জিনিয়ারিং জটিলতা পরিচালনা সম্পর্কে। জটিলতা পরিচালনার জন্য হাস্কেলের প্রাথমিক কোড স্ট্রাকচারিং পদ্ধতিগুলি হ'ল:

টাইপ সিস্টেম

  • মিথস্ক্রিয়া সরল করে বিমূর্তি প্রয়োগ করতে টাইপ সিস্টেমটি ব্যবহার করুন।
  • প্রকারের মাধ্যমে কী আক্রমণকারীদের কার্যকর করুন
    • (উদাহরণস্বরূপ যে নির্দিষ্ট মানগুলি কোনও সুযোগ থেকে বাঁচতে পারে না)
    • নির্দিষ্ট কোডটি কোনও আইও করে না, ডিস্কটি স্পর্শ করে না
  • সুরক্ষা প্রয়োগ করুন: পরীক্ষিত ব্যতিক্রম (সম্ভবত / একসাথে), মিশ্রিত ধারণাগুলি এড়িয়ে চলুন (শব্দ, আন্ত, ঠিকানা)
  • ভাল ডেটা স্ট্রাকচার (জিপার্সের মতো) পরীক্ষার কিছু শ্রেণির প্রয়োজনহীন করতে পারে, কারণ তারা যেমন স্ট্যাটিকভাবে সীমানা ত্রুটির বাইরে চলে যায়।

প্রোফাইলার

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

বিশুদ্ধতা

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

পরীক্ষামূলক

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

কাঠামোগত জন্য মনডস

  • মনডগুলি মূল স্থাপত্য নকশাগুলি বিভিন্ন ধরণের ক্যাপচার করে (এই কোডটি হার্ডওয়্যার অ্যাক্সেস করে, এই কোডটি একক-ব্যবহারকারীর সেশন ইত্যাদি)
  • যেমন এক্সমোনাদে এক্স মোনাড, সিস্টেমের কোন উপাদানগুলির জন্য কোন রাজ্যটি দৃশ্যমান তা সুনির্দিষ্টভাবে নকশাকে ক্যাপচার করে।

ক্লাস এবং অস্তিত্বের প্রকার টাইপ করুন

  • বিমূর্ততা প্রদানের জন্য প্রকারের ক্লাস ব্যবহার করুন: পলিমারফিক ইন্টারফেসের পিছনে বাস্তবায়নগুলি আড়াল করুন।

সংহত এবং সমান্তরালতা

  • ছিঁচকে চোর parআপনার প্রোগ্রাম সহজ, composable উপমা সঙ্গে প্রতিযোগিতায় বীট মধ্যে।

Refactor

  • আপনি মধ্যে Haskell refactor করতে অনেক । প্রকারগুলি নিশ্চিত করে যে আপনার বৃহত আকারের পরিবর্তনগুলি নিরাপদ হবে, যদি আপনি বিজ্ঞতার সাথে প্রকারগুলি ব্যবহার করেন। এটি আপনার কোডবেস স্কেলে সহায়তা করবে। আপনার রিফ্যাক্টরিংগুলি সম্পূর্ণ না হওয়া পর্যন্ত ধরণের ত্রুটি সৃষ্টি করবে তা নিশ্চিত করুন।

বুদ্ধিমানভাবে এফএফআই ব্যবহার করুন

  • এফএফআই বিদেশী কোডের সাথে খেলতে সহজ করে তোলে তবে বিদেশী কোডটি বিপজ্জনক হতে পারে।
  • ফিরে আসা ডেটার আকৃতি সম্পর্কে অনুমানের ক্ষেত্রে খুব সতর্কতা অবলম্বন করুন।

মেটা প্রোগ্রামিং

  • কিছুটা টেম্পলেট হাস্কেল বা জেনেরিকগুলি বয়লারপ্লেট সরাতে পারে।

প্যাকেজিং এবং বিতরণ

  • ক্যাবল ব্যবহার করুন। আপনার নিজস্ব বিল্ড সিস্টেম রোল করবেন না। (সম্পাদনা: আসলে আপনি সম্ভবত স্ট্যাকটি এখনই শুরু করার জন্য ব্যবহার করতে চান ))
  • ভাল এপিআই ডক্সের জন্য হ্যাডক ব্যবহার করুন
  • গ্রাফমোডের মতো সরঞ্জামগুলি আপনার মডিউল কাঠামো প্রদর্শন করতে পারে।
  • যদি সম্ভব হয় তবে গ্রন্থাগার এবং সরঞ্জামগুলির হাস্কেল প্ল্যাটফর্ম সংস্করণগুলির উপর নির্ভর করুন। এটি একটি স্থিতিশীল বেস। (সম্পাদনা: আবার, এই দিনগুলিতে আপনি সম্ভবত একটি স্থিতিশীল বেস আপ এবং চলমান জন্য স্ট্যাক ব্যবহার করতে চান ))

সতর্কবাণী

  • -Wallআপনার কোডটি গন্ধ থেকে পরিষ্কার রাখতে ব্যবহার করুন । আরও আশ্বাসের জন্য আপনি আগদা, ইসাবেল বা ক্যাচের দিকেও নজর দিতে পারেন। লিন্টের মতো পরীক্ষণের জন্য, দুর্দান্ত ইঙ্গিতটি দেখুন , যা উন্নতির পরামর্শ দেবে।

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

সাধারণভাবে: পচা ক্ষুদ্রতম referentially স্বচ্ছ সম্ভব উপাদান আপনার সিস্টেমকে লজিক্যাল ইউনিট, তারপর তাদের মডিউল বাস্তবায়ন। উপাদানগুলির সেটগুলির জন্য গ্লোবাল বা স্থানীয় পরিবেশগুলি (বা অভ্যন্তরের উপাদানগুলি) মোদে ম্যাপ করা যেতে পারে। মূল ডেটা স্ট্রাকচার বর্ণনা করতে বীজগণিত ডেটা টাইপ ব্যবহার করুন। সেই সংজ্ঞাগুলি ব্যাপকভাবে ভাগ করুন।


8
ধন্যবাদ ডন, আপনার উত্তরটি দুর্দান্ত - এগুলি সমস্ত মূল্যবান নির্দেশিকা এবং আমি নিয়মিত সেগুলি উল্লেখ করব। আমার ধারণা, যদিও আমার প্রশ্নটির একটি পদক্ষেপ ঘটেছিল তার আগে এই সমস্তটির প্রয়োজন হবে। আমি যা জানতে চাই তা হ'ল "প্রকার / ফাংশন / শ্রেণি / মনডে নকশার নকশার জন্য আইডিয়ামস" ... আমি নিজের আবিষ্কার করার চেষ্টা করতে পারতাম, তবে আমি আশা করছিলাম যে কোথাও নিঃসৃত সেরা অনুশীলনের একটি সেট থাকতে পারে - বা যদি তা না হয় তবে বৃহত-ইশ সিস্টেমটি পড়ার জন্য সু-কাঠামোগত কোডের জন্য প্রস্তাবনাগুলি (যেমন বলা যায়, একটি ফোকাসযুক্ত লাইব্রেরির বিপরীতে)। এই একই প্রশ্নটি আরও সরাসরি জিজ্ঞাসা করার জন্য আমি আমার পোস্ট সম্পাদনা করেছি।
ড্যান

6
আমি মডিউলগুলিতে ডিজাইনের পচন ধরে কিছু পাঠ্য যুক্ত করেছি। আপনার লক্ষ্য হ'ল লজিকালি সম্পর্কিত ফাংশনগুলি মডিউলগুলিতে চিহ্নিত করা উচিত যা সিস্টেমের অন্যান্য অংশগুলির সাথে স্বচ্ছ ইন্টারফেস রয়েছে এবং বাইরের বিশ্বের নিরাপদভাবে মডেল করার জন্য যত তাড়াতাড়ি সম্ভব খাঁটি কার্যকরী ডেটা ধরণের ব্যবহার করা। এক্সমোনড ডিজাইন ডকুমেন্টটি এর অনেকগুলি জুড়ে: xmonad.wordpress.com/2009/09/09/…
ডন স্টুয়ার্ট

3
আমি হাস্কেলের আলাপে ইঞ্জিনিয়ারিং বড় প্রকল্পগুলি থেকে স্লাইডগুলি ডাউনলোড করার চেষ্টা করেছি , তবে লিঙ্কটি নষ্ট হয়ে গেছে বলে মনে হয়েছে। এখানে একটি কার্যক্ষম রয়েছে: গ্যালোইস ডটকম
ডালস

3
আমি এই নতুন ডাউনলোড লিঙ্কটি খুঁজে পেয়েছি: pau-za.cz/data/2/sprava.pdf
রিকার্ডো টি।

3
@ হিদার যদিও ঠিক আগে মন্তব্যে উল্লিখিত পৃষ্ঠাটিতে ডাউনলোড লিঙ্কটি কাজ করছে না, মনে হচ্ছে স্লাইডগুলি এখনও স্ক্রাইডে দেখা যেতে পারে: scribd.com/doc/19503176/The-
রিকার্ডো টি।

118

ডন আপনাকে উপরের বেশিরভাগ বিবরণ দিয়েছিল, তবে এখানে হাস্কেলের সিস্টেম ডেমনগুলির মতো সত্যই নিতান্ত-মজাদার রাষ্ট্রীয় প্রোগ্রামগুলি করা থেকে আমার দুটি সেন্ট।

  1. শেষ পর্যন্ত, আপনি একটি মোনাড ট্রান্সফর্মার স্ট্যাকের মধ্যে বাস করেন। নীচে IO। তার উপরে, প্রতিটি বড় মডিউল (বিমূর্ত অর্থে, মডিউল-ইন-এ-ফাইল অর্থে নয়) তার প্রয়োজনীয় অবস্থাকে সেই স্ট্যাকের একটি স্তর হিসাবে ম্যাপ করে। সুতরাং আপনার যদি আপনার ডাটাবেস সংযোগ কোডটি একটি মডিউলে লুকানো থাকে তবে আপনি এগুলি সমস্ত কোনও একরকম লিখে রাখুন MonadReader সংযোগ m => ... -> মি ... এবং তারপরে আপনার ডাটাবেস ফাংশনগুলি সর্বদা অন্যের ফাংশন ছাড়াই তাদের সংযোগ পেতে পারে মডিউলগুলি এর অস্তিত্ব সম্পর্কে সচেতন হতে হবে। আপনার ডাটাবেস সংযোগ বহনকারী একটি স্তর, অন্যটি আপনার কনফিগারেশন, সমান্তরালতা এবং সিঙ্ক্রোনাইজেশনের রেজোলিউশনের জন্য তৃতীয় আপনার বিভিন্ন সেমফোর এবং mvars, অন্য আপনার লগ ফাইল হ্যান্ডলস ইত্যাদির সমাপ্তি হতে পারে might

  2. প্রথমে আপনার ত্রুটিটি পরিচালনা করার বিষয়টি চিত্রিত করুন । বৃহত্তর সিস্টেমে হাস্কেলের পক্ষে এই মুহুর্তের সবচেয়ে বড় দুর্বলতা হ'ল ত্রুটি পরিচালনার পদ্ধতিগুলির আধিক্য, যার মতো লসিগুলিও হতে পারে (যা ভুল হয়েছে কারণ আপনি যা ভুল করেছেন তার কোনও তথ্য ফেরত দিতে পারবেন না; সর্বদা পরিবর্তে হয় ব্যবহার করুন সম্ভবত আপনি যদি সত্যই না হন শুধু মূল্যবোধ হারিয়ে যাওয়া বোঝায়)। আপনি কীভাবে এটি প্রথমে করতে যাচ্ছেন তা নির্ধারণ করুন এবং আপনার গ্রন্থাগারগুলি এবং অন্যান্য কোডগুলি আপনার চূড়ান্ত কোনওটিতে ব্যবহার করে বিভিন্ন ত্রুটি পরিচালনা করার পদ্ধতি থেকে অ্যাডাপ্টার সেট আপ করুন। এটি পরে আপনাকে শোকের একটি পৃথিবী বাঁচাবে।

সংযোজন (মন্তব্য থেকে নিষ্কাশিত; ধন্যবাদ Lii & liminalisht ) -
একটি স্ট্যাক monads মধ্যে একটি বৃহৎ কর্মসূচি যেভাবেই বিভিন্ন উপায় সম্পর্কে আরো আলোচনা:

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


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

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

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

@ পল জনসন যেমন ইতিমধ্যে উল্লেখ করেছেন, এই মোনাড ট্রান্সফর্মার স্ট্যাক পদ্ধতির সাথে মাইকেল স্নোইম্যানের রিডারটি ডিজাইন প্যাটার্ন
হোল্ডেন

43

হাস্কেলে বড় প্রোগ্রাম ডিজাইন করা অন্যান্য ভাষায় করা থেকে আলাদা নয়। বড় আকারে প্রোগ্রামিং হ'ল আপনার সমস্যাটিকে পরিচালনাযোগ্য টুকরো টুকরো টুকরো করে তোলা এবং কীভাবে এটি একসাথে ফিট করা যায়; বাস্তবায়ন ভাষা কম গুরুত্বপূর্ণ।

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

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


14
আমি প্রকৃতপক্ষে আবিষ্কার করেছি যে রিফ্যাক্টরিং হতাশাজনক, যদি ডেটা ধরণের পরিবর্তন করার প্রয়োজন হয়। এটি প্রচুর পরিমাণে নির্মাতা এবং প্যাটার্ন-মিলগুলির কৌতূহল সংশোধন করা দরকার। (আমি একমত যে একই ধরণের অন্যান্য খাঁটি ফাংশনগুলিতে খাঁটি ফাংশনগুলিকে রিফ্যাক্ট করা সহজ - যতক্ষণ না কেউ তথ্য ধরণের স্পর্শ না করে)
ড্যান

2
@ ড্যান আপনি যখন ছোট রেকর্ড ব্যবহার করেন তখন ছোট পরিবর্তনগুলি (যেমন কেবল কোনও ক্ষেত্র যুক্ত করার মতো) দিয়ে সম্পূর্ণ মুক্ত হয়ে যেতে পারেন। কিছু রেকর্ডকে একটি অভ্যাস
বানাতে

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

4
জাভা এর মতো ভাষার জন্য @ সেমিকন পার্থক্য হ'ল রিফ্যাক্টরিংয়ের জন্য পরিপক্ক, ভাল-পরীক্ষিত এবং সম্পূর্ণ স্বয়ংক্রিয় সরঞ্জামের অস্তিত্ব। সাধারণত এই সরঞ্জামগুলির দুর্দান্ত সম্পাদক ইন্টিগ্রেশন থাকে এবং রিফ্যাক্টরিংয়ের সাথে যুক্ত প্রচুর ক্লান্তিকর কাজটি নিয়ে যায়। হাস্কেল আমাদের একটি উজ্জ্বল ধরণের সিস্টেম দেয় যার সাহায্যে এমন জিনিসগুলি সনাক্ত করতে পারে যা একটি রিফ্যাক্টরিংয়ে পরিবর্তন করা উচিত তবে বাস্তবে যে রিফেক্টরিং করা সম্ভব তা কার্যকর করার সরঞ্জামগুলি (বর্তমান মুহুর্তে) খুব সীমিত, বিশেষত জাভাতে ইতিমধ্যে যা পাওয়া গেছে তার তুলনায় 10 বছরেরও বেশি সময় ধরে বাস্তুতন্ত্র।
jsk

16

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

ক্র্যাক্ট অফ ফাংশনাল প্রোগ্রামিং

ক্র্যাক্ট অফ ফাংশনাল প্রোগ্রামিং

http://www.cs.kent.ac.uk/people/staff/sjt/craft2e/


11
এফপির ক্র্যাফট হিসাবে যতটা দুর্দান্ত - আমি এটি থেকে হাস্কেল শিখেছি - এটি প্রাথমিক প্রোগ্রামারদের জন্য একটি প্রাথমিক পাঠ্য , হাস্কেলের বড় সিস্টেমে ডিজাইনের জন্য নয়।
ডন স্টুয়ার্ট

3
ওয়েল, এটি এপিআই ডিজাইন করা এবং প্রয়োগের বিবরণ গোপন করার বিষয়ে আমার জানা সেরা বই। এই বইটি সহ, আমি সি ++ তে আরও ভাল প্রোগ্রামার হয়েছি - কেবল আমার কোডটি সাজানোর জন্য আরও ভাল উপায়গুলি শিখেছি বলে। ঠিক আছে, আপনার অভিজ্ঞতা (এবং উত্তর) অবশ্যই এই বইয়ের চেয়ে ভাল তবে ড্যান সম্ভবত এখনও হাস্কেলের একজন শিক্ষানবিস হতে পারেন । ( where beginner=do write $ tutorials `about` Monads)
কমোনাদ

11

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

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

আপনি এখানে বইটির কোড এবং 'অ্যান্ড্রোমিডা' প্রকল্প কোডের সাথে পরিচিত হতে পারেন ।

আমি 2017. শেষে এই বইয়ের শেষ না হওয়া পর্যন্ত এটি ঘটে তবে আপনি আমার প্রবন্ধটি "ডিজাইন এবং আর্কিটেকচার কার্যকরী প্রোগ্রামিং মধ্যে" (রুশ ভাষায়) পড়ে দেখতে পারেন আশা এখানে

হালনাগাদ

আমি আমার বইটি অনলাইনে ভাগ করেছি (প্রথম 5 অধ্যায়)। রেডডিতে পোস্ট দেখুন


আলেকজান্ডার, আপনি বইটি সম্পূর্ণ হয়ে গেলে দয়া করে এই নোটটি আপডেট করতে পারেন, যাতে আমরা এটি অনুসরণ করতে পারি। চিয়ার্স।
সর্বাধিক

4
নিশ্চিত! আপাতত আমি পাঠ্যের অর্ধেকটি শেষ করেছি, তবে এটি সামগ্রিক কাজের 1/3 অংশ। সুতরাং, আপনার আগ্রহ রাখুন, এটি আমাকে অনেক অনুপ্রাণিত করে!
গ্রানিনাস

2
ওহে! আমি আমার বইটি অনলাইনে শেয়ার করেছি (কেবল প্রথম 5 টি অধ্যায়)। রেডডিটে
গ্রানিনাস

ভাগ করে নেওয়ার জন্য এবং কাজের জন্য ধন্যবাদ!
সর্বাধিক

সত্যিই এই অপেক্ষায়!
পিতৃপুরুষরা

7

গ্যাব্রিয়েলের ব্লগ পোস্ট স্কেলেবল প্রোগ্রাম আর্কিটেকচারগুলি উল্লেখযোগ্য হতে পারে।

হাস্কেল ডিজাইনের ধরণগুলি একটি গুরুত্বপূর্ণ উপায়ে মূলধারার নকশার ধরণগুলির থেকে পৃথক:

  • প্রচলিত আর্কিটেকচার : বি টাইপের একটি "নেটওয়ার্ক" বা "টপোলজি" তৈরি করতে টাইপ এ এর ​​একাধিক উপাদান একত্রিত করুন

  • হ্যাস্কেল আর্কিটেকচার : একই ধরণের এ এর ​​নতুন উপাদান তৈরি করতে তার টাইপ এ এর ​​একাধিক উপাদান একত্রিত করুন, তার বিকল্প অংশগুলি থেকে অক্ষরকে পৃথক করা যায়

এটি প্রায়শই আমাকে আঘাত করে যে একটি দৃশ্যত মার্জিত আর্কিটেকচার প্রায়শই গ্রন্থাগারগুলির বাইরে পড়ে যেগুলি এই নিখরচায় এই সুন্দর বোধগম্যতা প্রদর্শন করে, নীচের অংশে। মধ্যে Haskell এটি বিশেষত আপাত - ধরণগুলির ঐতিহ্যগতভাবে "টপ-ডাউন স্থাপত্য" বিবেচিত হবে মত গ্রন্থাগারে ক্যাপচার করা থাকে MVC , Netwire এবং ক্লাউড Haskell, । এটি বলার অপেক্ষা রাখে না, আমি আশা করি যে এই উত্তরটি এই থ্রেডের অন্য যে কোনও ব্যক্তিকে প্রতিস্থাপনের প্রয়াস হিসাবে ব্যাখ্যা করা হবে না, কেবলমাত্র কাঠামোগত পছন্দগুলি ডোমেন বিশেষজ্ঞদের দ্বারা লাইব্রেরিতে আদর্শভাবে বিমূর্ত হয়ে যেতে পারে এবং হওয়া উচিত। আমার মতে বৃহত্তর সিস্টেমগুলি নির্মাণে আসল অসুবিধা হ'ল আপনার সমস্ত বাস্তববাদী উদ্বেগের বিপরীতে এই গ্রন্থাগারগুলি তাদের স্থাপত্য "ধার্মিকতা" সম্পর্কে মূল্যায়ন করা।

যেমন লিমিনালিশ্ট মন্তব্যগুলিতে উল্লেখ করেছেন, বিভাগের নকশার প্যাটার্নটি বিষয়টিতে গ্যাব্রিয়েলের আরও একটি অনুরূপ শিরাতে পোস্ট।


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


3

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

এইভাবে আপনি প্রথম থেকেই হাস্কেলের সাহায্য থেকে উপকৃত হন এবং কোডিংটি প্রাকৃতিক। আপনার মনে মনে যদি কিছু একটা সাধারণ সমস্যা হয় তবে আমি "কার্যকরী" বা "খাঁটি" বা পর্যাপ্ত সাধারণ কিছু করার যত্ন নেব না। আমি মনে করি যে আইটি-র মধ্যে ওভার ইঞ্জিনিয়ারিং সবচেয়ে বিপজ্জনক জিনিস। সমস্যাগুলি যখন কোনও লাইব্রেরি তৈরি করা হয় যা সম্পর্কিত সমস্যার একটি সেট বিমূর্ত করে তোলে Th

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