পার্শ্ব প্রতিক্রিয়াগুলি পরিচালনা করার জন্য আইও মোনাড প্যাটার্নের সুবিধা কি নিখুঁতভাবে একাডেমিক?


17

আরও একটি এফপি + পার্শ্ব প্রতিক্রিয়া প্রশ্নের জন্য দুঃখিত, তবে আমার কাছে এটির উত্তর পাওয়া যায় এমন একটি বিদ্যমান সন্ধান করতে পারি নি।

ফাংশনাল প্রোগ্রামিং সম্পর্কে আমার (সীমাবদ্ধ) বোধগম্যতা হল রাষ্ট্র / পার্শ্ব প্রতিক্রিয়াগুলি হ্রাস করা উচিত এবং রাষ্ট্রবিহীন যুক্তি থেকে পৃথক রাখা উচিত।

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

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

অপরিশোধিত উদাহরণ আগমন।

যদি আমার প্রোগ্রামটি কোনও এক্সএমএল ফাইলকে একটি জেএসএন ফাইলে রূপান্তর করে:

def main():
    xml_data = read_file('input.xml')  # impure
    json_data = convert(xml_data)  # pure
    write_file('output.json', json_data) # impure

এটি করতে কার্যকরভাবে আইও মোনাডের দৃষ্টিভঙ্গি নয়:

steps = list(
    read_file,
    convert,
    write_file,
)

তাহলে সেই পদক্ষেপগুলিতে আসলে কল না করে দোভাষীকে তা করতে দিয়ে দায়বদ্ধতা থেকে নিজেকে মুছে ফেলুন?

বা অন্য কোনও উপায়ে লিখুন, এটি লেখার মতো:

def main():  # pure
    def inner():  # impure
        xml_data = read_file('input.xml')
        json_data = convert(xml_data)
        write_file('output.json', json_data)
    return inner

তারপরে অন্য কাউকে কল করার আশা করা inner()এবং বলা আপনার কাজটি সম্পন্ন হয়েছে কারণ main()খাঁটি।

পুরো প্রোগ্রামটি মূলত আইও মোনাডে অন্তর্ভুক্ত হতে চলেছে।

কোডটি আসলে কার্যকর করা হয় , ফাইলটি পড়ার পরে সমস্ত কিছুই সেই ফাইলের অবস্থার উপর নির্ভর করে তাই এখনও প্রয়োজনীয় রাজ্য সম্পর্কিত বাগগুলি যেমন অত্যাবশ্যক বাস্তবায়ন হিসাবে ভুগবে, তাই আপনি কি প্রোগ্রামার হিসাবে বাস্তবে কিছু অর্জন করেছেন?

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

আমি এও প্রশংসা করি যে মোনাডিক প্রকারগুলি কার্যকর হতে পারে, বিশেষত তুলনামূলক প্রকারের পাইপলাইনগুলিতে কার্যকর, তবে ইতিমধ্যে এইরকম পাইপলাইন না থাকলে আইও কেন মোনাদ ব্যবহার করা উচিত তা দেখবেন না।

আইও মোনাড প্যাটার্ন নিয়ে আসে এমন পার্শ্ব প্রতিক্রিয়াগুলি মোকাবেলায় কী কী অতিরিক্ত সুবিধা রয়েছে যা আমি মিস করছি?


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

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

হুম ... এজেএক্সকে কি I / O এর রূপ বিবেচনা করা হয় না?
রবার্ট হার্ভে

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

আপনার উদাহরণস্বরূপ, মোনাডিক অংশটি হ'ল আপনি যখন কোনও গণনার ফলাফল গ্রহণ করেন ( read_file) এবং পরেরটি ( write_file) এর সাথে যুক্তি হিসাবে এটি ব্যবহার করেন । আপনার যদি কেবল স্বাধীন ক্রিয়াগুলির ক্রম থাকে তবে আপনার একটি মোনাডের প্রয়োজন হবে না।
lortabac

উত্তর:


14

পুরো প্রোগ্রামটি মূলত আইও মোনাডে অন্তর্ভুক্ত হতে চলেছে।

এটিই হ'ল যেখানে আমি মনে করি আপনি এটি হ্যাস্কিলারদের দৃষ্টিকোণ থেকে দেখছেন না। সুতরাং আমরা এই মত একটি প্রোগ্রাম আছে:

module Main

main :: IO ()
main = do
  xmlData <- readFile "input.xml"
  let jsonData = convert xmlData
  writeFile "output.json" jsonData

convert :: String -> String
convert xml = ...

আমি মনে করি একটি সাধারণ হাস্কেলারের গ্রহণযোগ্য অংশটি হ'ল convertশুদ্ধ অংশ:

  1. সম্ভবত এই প্রোগ্রামটির বেশিরভাগ অংশ, এবং IOঅংশগুলির চেয়ে অনেক বেশি জটিল ;
  2. মোটামুটি কিছু না করেই যুক্তিযুক্ত ও পরীক্ষিত হতে পারে IO

সুতরাং তারা এটিকে convert"অন্তর্নিহিত" হিসাবে দেখছেন না IO, বরং এটি থেকে বিচ্ছিন্ন হওয়ার কারণে IO। এর ধরণ থেকে, যা কিছু convertতা কখনই কোনও IOক্রিয়ায় ঘটে যাওয়া কোনও কিছুর উপর নির্ভর করে না ।

কোডটি আসলে কার্যকর করা হয়, ফাইলটি পড়ার পরে সমস্ত কিছুই সেই ফাইলের অবস্থার উপর নির্ভর করে তাই এখনও প্রয়োজনীয় রাজ্য সম্পর্কিত বাগগুলি যেমন অত্যাবশ্যক বাস্তবায়ন হিসাবে ভুগবে, তাই আপনি কি প্রোগ্রামার হিসাবে বাস্তবে কিছু অর্জন করেছেন?

আমি বলব যে এটি দুটি জিনিসে বিভক্ত হয়:

  1. যখন প্রোগ্রাম চালায়, এর মান যুক্তি করার convertফাইলের রাষ্ট্র উপর নির্ভর করে।
  2. কিন্তু কি convertফাংশন আছে , যে ফাইলের রাষ্ট্র উপর নির্ভর করে না। convertএটি সর্বদা একই ফাংশন , এমনকি যদি এটি বিভিন্ন পয়েন্টে বিভিন্ন যুক্তি সহ আহ্বান করা হয়।

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

সুতরাং যদি convertকিছু যুক্তি থেকে ভুল ফলাফল পাওয়া যায় এবং readFileএটিকে একটি যুক্তি ফিড করে, আমরা দেখতে পাচ্ছি না যে এটি রাষ্ট্র হিসাবে প্রবর্তিত একটি বাগ হিসাবে । এটি খাঁটি ফাংশনে একটি বাগ!


আমি মনে করি এটি সর্বোত্তম বিবরণ (যদিও অন্যরাও আমার পক্ষে বিষয়গুলি পরিষ্কার করতে সহায়তা করেছিল), ধন্যবাদ।
স্টু কক্স

এটা কি লক্ষণীয় যে অজগরটিতে স্নাতক ব্যবহারের ফলে কম উপকার পাওয়া যেতে পারে কারণ পাইথনের কেবল একটি (স্ট্যাটিক) ধরণের রয়েছে, এবং তাই কোনও কিছুর বিষয়ে কোনও গ্যারান্টি দেয় না?
জে কে।

7

"খাঁটি একাডেমিক" বলতে আপনি ঠিক কী বোঝাতে পেরেছেন তা নিশ্চিত হওয়া শক্ত কিন্তু আমি মনে করি উত্তরটি বেশিরভাগ "না"।

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

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

নোট করুন যে এটি হাস্কেল এবং পাইথনের বিভিন্ন দর্শন সম্পর্কে আরও বেশি কিছু বলেছে যা একাডেমিক মনডিক I / O সম্পর্কে নয়। আমি পাইথনের জন্য এটি ব্যবহার করব না।

অন্য একটি জিনিস। তুমি বলো:

পুরো প্রোগ্রামটি মূলত আইও মোনাডে অন্তর্ভুক্ত হতে চলেছে।

এটি সত্য যে হাস্কেল mainফাংশনটি "বেঁচে আছে" IO, কিন্তু আসল হাস্কেল প্রোগ্রামগুলি IOযখনই প্রয়োজন হয় না তখন ব্যবহার না করার জন্য উত্সাহিত করা হয়। আপনি যে প্রায় প্রতিটি ফাংশন লিখেন তাতে I / O করার দরকার হয় না টাইপ করা উচিত নয় IO

সুতরাং আমি আপনার শেষ উদাহরণে বলব আপনি এটি পিছনের দিকে পেয়েছেন: mainঅপরিষ্কার (কারণ এটি ফাইল পড়েন এবং লেখেন) তবে মূল ফাংশনগুলি convertখাঁটি।


3

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

main = do  
    putStrLn "Please enter your name"  
    name <- getLine
    putStrLn $ "Hello, " ++ name

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

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


2

ফাংশনাল প্রোগ্রামিং সম্পর্কে আমার (সীমাবদ্ধ) বোধগম্যতা হল রাষ্ট্র / পার্শ্ব প্রতিক্রিয়াগুলি হ্রাস করা উচিত এবং রাষ্ট্রবিহীন যুক্তি থেকে পৃথক রাখা উচিত।

এটি কেবল কার্যকরী প্রোগ্রামিং নয়; এটি যে কোনও ভাষায় সাধারণত একটি ভাল ধারণা। আপনি ইউনিট টেস্টিং না, আপনি পৃথক্ বিভক্ত read_file(), convert()এবং write_file()পুরোপুরি স্বাভাবিকভাবেই আসে কারণ, সত্ত্বেও convert()কোডের পর্যন্ত সবচেয়ে জটিল এবং বৃহত্তম অংশ দ্বারা হচ্ছে, তার জন্য পরীক্ষা লেখার অপেক্ষাকৃত সহজ: আপনি সেট আপ করার প্রয়োজন ইনপুট প্যারামিটার । পরীক্ষা লেখার জন্য read_file()এবং write_file()এটি কিছুটা শক্ত (যদিও ফাংশনগুলি নিজেরাই প্রায় তুচ্ছ) যদিও আপনাকে ফাংশনটি কল করার আগে এবং পরে ফাইল সিস্টেমে জিনিসগুলি তৈরি করতে এবং / অথবা পড়তে হবে। আদর্শভাবে আপনি এই জাতীয় ফাংশনগুলি এত সহজ করে তুলবেন যে আপনি সেগুলি পরীক্ষা না করে স্বাচ্ছন্দ্য বোধ করেন এবং এভাবে নিজেকে অনেক ঝামেলা বাঁচান।

পাইথন এবং হাস্কেলের মধ্যে পার্থক্যটি হ'ল হাস্কেলের একটি টাইপ পরীক্ষক রয়েছে যা প্রমাণ করতে পারে যে ফাংশনগুলির কোনও পার্শ্ব প্রতিক্রিয়া নেই। পাইথনে আপনাকে আশা করা দরকার যে দুর্ঘটনাক্রমে কোনও ফাইল-পঠন বা রাইটিং ফাংশনে কারওর বাদ পড়েনি convert()(বলুন read_config_file())। হাসকেলে যখন আপনি ঘোষণা করেন convert :: String -> Stringবা অনুরূপ, কোনও IOমোনাড ছাড়াই , প্রকারের পরীক্ষক গ্যারান্টি দেবে যে এটি একটি খাঁটি ফাংশন যা কেবলমাত্র তার ইনপুট প্যারামিটারের উপর নির্ভর করে এবং অন্য কিছু নয়। যদি কেউ convertকোনও কনফিগার ফাইলটি পড়তে সংশোধন করার চেষ্টা করে তবে তারা দ্রুত সংকলক ত্রুটিগুলি দেখায় যে তারা ফাংশনের বিশুদ্ধতা ভঙ্গ করছে showing (এবং আশা করা যায় যে তারা বিশুদ্ধতা বজায় রেখে read_config_fileবাইরে চলে যেতে convertএবং এর ফলাফলটি পাস করার পক্ষে যথেষ্ট বুদ্ধিমান হবে convert))

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