খাঁটি কার্যকরী ভাষা সম্পর্কে ভুল ধারণা?


39

আমি প্রায়শই নিম্নলিখিত বিবৃতি / যুক্তিগুলির মুখোমুখি হই:

  1. খাঁটি ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি পার্শ্ব প্রতিক্রিয়াগুলিকে অনুমতি দেয় না (এবং তাই অনুশীলনে খুব কম ব্যবহার হয় কারণ কোনও কার্যকর প্রোগ্রামের পার্শ্ব প্রতিক্রিয়া যেমন, যখন এটি বাহ্যিক বিশ্বের সাথে যোগাযোগ করে))
  2. খাঁটি ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজ এমন কোনও প্রোগ্রাম লিখতে দেয় না যা রাষ্ট্র বজায় রাখে (যা প্রোগ্রামিংকে খুব বিশ্রী করে তোলে কারণ অনেক অ্যাপ্লিকেশনে আপনাকে রাষ্ট্রের প্রয়োজন হয়)।

আমি কার্যকরী ভাষাতে বিশেষজ্ঞ নই তবে এই বিষয়গুলি সম্পর্কে আমি এখন পর্যন্ত বুঝতে পেরেছি।

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

পয়েন্ট ২ সম্পর্কিত, যতদূর আমি জানি আপনি কয়েকটি গণনা পদক্ষেপের মাধ্যমে (থ্রিঙ্কে আবারও ম্যাসাডিক ধরণের ব্যবহার করে) মূল্যকে থ্রেড করে রাষ্ট্রের প্রতিনিধিত্ব করতে পারেন তবে আমার এটি করার কোনও ব্যবহারিক অভিজ্ঞতা নেই এবং আমার বোঝার বিষয়টি অস্পষ্ট।

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


7
আমি মনে করি এর বেশিরভাগ অংশ আপনি কোনও 'খাঁটি' কার্যকরী ভাষা কী হিসাবে সংজ্ঞায়িত করেছেন তার উপর নির্ভর করে।
জে কে।

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

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

উত্তর:


26

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

খাঁটি ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি পার্শ্ব প্রতিক্রিয়াগুলিকে অনুমতি দেয় না (এবং তাই অনুশীলনে খুব কম ব্যবহার হয় কারণ কোনও কার্যকর প্রোগ্রামের পার্শ্ব প্রতিক্রিয়া যেমন, যখন এটি বাহ্যিক বিশ্বের সাথে যোগাযোগ করে))

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

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

পয়েন্ট ১ সম্পর্কিত, আপনি পরিবেশের সাথে নিখুঁত ক্রিয়ামূলক ভাষায় যোগাযোগ করতে পারেন তবে আপনাকে তাদের কোড (ফাংশন) স্পষ্টভাবে চিহ্নিত করতে হবে যা তাদের পরিচয় করিয়ে দেয় (উদাহরণস্বরূপ মনডিক ধরণের মাধ্যমে হাস্কেল)।

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

খাঁটি ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজ এমন কোনও প্রোগ্রাম লিখতে দেয় না যা রাষ্ট্র বজায় রাখে (যা প্রোগ্রামিংকে খুব বিশ্রী করে তোলে কারণ অনেক অ্যাপ্লিকেশনে আপনাকে রাষ্ট্রের প্রয়োজন হয়)।

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

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

এগুলি যদি ভুল ধারণা হয় তবে তারা কীভাবে এলো?

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

পরিবর্তনীয় স্থিতিটি কার্যকরী ভাষাগুলিতে ব্যাপকভাবে নিরুৎসাহিত হয়, তাই এটি খাঁটি কার্যকরী ভাষায় একেবারেই অনুমোদিত নয় বলে ধরে নেওয়া খুব একটা লাফিয়ে যায় না।

(1) পার্শ্ব প্রতিক্রিয়াগুলি প্রয়োগ করতে এবং (2) রাষ্ট্রের সাথে একটি গণনা বাস্তবায়ন করার জন্য হাস্কেল ইডিয়োমেটিক পদ্ধতিতে চিত্রিত একটি (সম্ভবত ছোট) কোড স্নিপেট লিখতে পারেন?

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

greet(name) = print("Hello, " ++ name ++ "!")
main = composeMonad(readLine, greet)

এখানে ক্লুটি হ'ল এটি readLineটাইপের মান IO<String>এবং composeMonadএটি এমন একটি ফাংশন যা টাইপের একটি আর্গুমেন্ট গ্রহণ করে IO<T>(কিছু প্রকারের জন্য T) এবং অন্য একটি যুক্তি যা একটি ফাংশন যা টাইপের একটি আর্গুমেন্ট গ্রহণ করে Tএবং টাইপের মান IO<U>(কোনও প্রকারের জন্য U) প্রদান করে। printএকটি ফাংশন যা একটি স্ট্রিং নেয় এবং টাইপের মান প্রদান করে IO<void>

প্রকারের মান IO<A>হ'ল একটি মান যা প্রদত্ত ক্রিয়াকে "এনকোড করে" দেয় যা প্রকারের মান উৎপন্ন করে AcomposeMonad(m, f)একটি নতুন IOমান উত্পাদন করে যা ক্রিয়াকে mঅনুসরণ করে এর ক্রিয়াকে এনকোড করে f(x), যেখানে xক্রিয়া সম্পাদন করে মানটি উত্পাদন করে m

পরিবর্তনীয় স্থিতিটি এমন দেখাচ্ছে:

counter = mutableVariable(0)
increaseCounter(cnt) =
    setIncreasedValue(oldValue) = setValue(cnt, oldValue + 1)
    composeMonad(getValue(cnt), setIncreasedValue)

printCounter(cnt) = composeMonad( getValue(cnt), print )

main = composeVoidMonad( increaseCounter(counter), printCounter(counter) )

এখানে mutableVariableএকটি ফাংশন যা কোনও ধরণের মান নেয় Tএবং একটি উত্পাদন করে MutableVariable<T>। ফাংশন getValueএমনটি গ্রহণ করে যা তার বর্তমান মান উত্পাদন করে MutableVariablereturns লাগে এবং একটি এবং আয় একটি যে মান সেট করে। হিসাবে একই ছাড়া প্রথম আর্গুমেন্ট একটি হল যে একটি যুক্তিসম্মত মান এবং দ্বিতীয় যুক্তি হতে পারে না অন্য একসংখ্যা, না একটি ফাংশন যা রিটার্ন একটি একসংখ্যা হয়।IO<T>setValueMutableVariable<T>TIO<void>composeVoidMonadcomposeMonadIO

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


দুর্দান্ত উত্তর, অনেক আইডিয়া স্পষ্ট করে। কোড শেষ লাইন নাম ব্যবহার স্নিপেট উচিত counter, অর্থাত্ increaseCounter(counter)?
জর্জিও

@ জর্জিও হ্যাঁ, এটি করা উচিত। সংশোধন করা হয়েছে।
sepp2k

1
@ জর্জিও একটি বিষয় আমি আমার পোস্টে স্পষ্টভাবে উল্লেখ করতে ভুলে গেছি যে যে আইও পদক্ষেপটি ফিরে এসেছে তা হ'ল mainবাস্তবে মৃত্যুদন্ড কার্যকর হবে। কোনও আইওকে ফিরিয়ে দেওয়া ছাড়াও ক্রিয়াকলাপ mainচালানোর কোনও উপায় নেই IO( unsafeতাদের নামে ভয়াবহভাবে মন্দ কাজগুলি ব্যবহার না করে )।
sepp2k

ঠিক আছে. স্কার্ফ্রিজে ধ্বংসাত্মক IOমানগুলির কথাও উল্লেখ করা হয়েছিল । আমি বুঝতে পারি নি যে সে প্যাটার্ন মেলানোকে বোঝায়, অর্থাত্ আপনি বীজগণিত তথ্য প্রকারের মানগুলি ডিকনস্ট্রাক্ট করতে পারেন, তবে IOমানগুলির সাথে এটি করার জন্য কেউ প্যাটার্ন মেলানো ব্যবহার করতে পারে না ।
জর্জিও

16

আইএমএইচও আপনি বিভ্রান্ত কারণ একটি খাঁটি ভাষা এবং খাঁটি ফাংশনের মধ্যে পার্থক্য রয়েছে । আসুন ফাংশন দিয়ে শুরু করা যাক। কোনও ফাংশন শুদ্ধ যদি এটি (একই ইনপুট দেওয়া হয়) সর্বদা একই মান প্রদান করে এবং কোনও পর্যবেক্ষণযোগ্য পার্শ্ব প্রতিক্রিয়া সৃষ্টি না করে। সাধারণ উদাহরণগুলি f (x) = x * x এর মতো গাণিতিক ফাংশন। এখন এই ফাংশন একটি বাস্তবায়ন বিবেচনা করুন। এটি বেশিরভাগ ভাষায় খাঁটি হবে এমন কি এমনকি সাধারণত যেগুলি খাঁটি কার্যকরী ভাষা হিসাবে বিবেচিত হয় না যেমন এমএল। এমনকি এই আচরণ সহ একটি জাভা বা সি ++ পদ্ধতিও খাঁটি হিসাবে বিবেচিত হতে পারে।

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

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

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

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

হাস্কেলে এটি আইও টাইপ দিয়ে সম্পন্ন হয়। আপনি কোনও আইও ফলাফল ধ্বংস করতে পারবেন না (অনিরাপদ প্রক্রিয়া ছাড়াই)। সুতরাং আপনি কেবলমাত্র আইও মডিউলগুলিতে সংজ্ঞায়িত ফাংশনগুলির সাথে আইও ফলাফলগুলি প্রক্রিয়া করতে পারেন। ভাগ্যক্রমে একটি খুব নমনীয় কম্বিনেটর রয়েছে যা আপনাকে একটি আইও ফলাফল নিতে এবং কোনও ফাংশনে এটি প্রক্রিয়া করার অনুমতি দেয় যতক্ষণ না সেই ফাংশনটি অন্য আইও ফলাফল প্রদান করে। এই সংমিশ্রকটিকে বাঁধাই (বা >>=) বলা হয় এবং এটির ধরণ রয়েছে IO a -> (a -> IO b) -> IO b। আপনি যদি এই ধারণাকে সাধারণীকরণ করেন তবে আপনি মোনাড শ্রেণিতে পৌঁছে যান এবং আইও এর উদাহরণ হতে পারে।


4
আমি আসলে দেখতে পাই না যে হাস্কেল ( unsafeএর নামে কোনও ফাংশন উপেক্ষা করে) আপনার আদর্শিক সংজ্ঞাটি কীভাবে পূরণ করে না। হাস্কেলের কোনও অশুচি ফাংশন নেই (আবার উপেক্ষা unsafePerformIOএবং কো।)
sepp2k

4
readFileএবং writeFileসর্বদা IOএকই আর্গুমেন্ট দেওয়া, একই মান প্রদান করবে। সুতরাং উদাহরণস্বরূপ দুটি কোড স্নিপেট let x = writeFile "foo.txt" "bar" in x >> xএবং writeFile "foo.txt" "bar" >> writeFile "foo.txt" "bar"একই জিনিস করবে।
sepp2k

3
@ আইদানকুলি "আইও ফাংশন" বলতে আপনার অর্থ কী? একটি ফাংশন যা টাইপের মান প্রদান করে IO Something? যদি তা হয় তবে একই তর্ক দিয়ে দু'বার আইও ফাংশন কল করা পুরোপুরি সম্ভব: putStrLn "hello" >> putStrLn "hello"- এখানে উভয় কল putStrLnএকই আর্গুমেন্টের সাথে রয়েছে have অবশ্যই এটি কোনও সমস্যা নয় কারণ, যেমনটি আমি আগেই বলেছিলাম, উভয় কল একই আইও মানের ফলস্বরূপ।
sepp2k

3
@scarfridge মূল্যায়ন writeFile "foo.txt" "bar"ত্রুটির কারণ হতে পারে না কারণ ফাংশন কল মূল্যায়ন ক্রিয়াকে কার্যকর করে না । যদি আপনি বলছেন যে আমার আগের উদাহরণটিতে সংস্করণটির letআইও ব্যর্থতার কেবল একটি সুযোগ রয়েছে যখন বিনা সংস্করণটি letদুটি থাকে তবে আপনি ভুল। উভয় সংস্করণে আইও ব্যর্থতার জন্য দুটি সুযোগ রয়েছে। যেহেতু letসংস্করণটি writeFileকেবল একবার কলটির মূল্যায়ন করে যখন সংস্করণ ছাড়াই সংস্করণটি এটি letদুবার মূল্যায়ন করে, আপনি দেখতে পাবেন যে ফাংশনটি প্রায়শই বলা হয় তা বিবেচনা করে না। এটি কেবলমাত্র কতবার ফলাফল হিসাবে
বিবেচিত

6
@ আইডানকুলি "মোনাড মেকানিজম" অন্তর্নিহিত পরামিতিগুলির কাছাকাছি যায় না। putStrLnফাংশন ঠিক একটি যুক্তি, ধরনের যা লাগে String। যদি আমাকে বিশ্বাস করে না, তার ধরণ তাকান: String -> IO ()। এটি অবশ্যই কোনও ধরণের আর্গুমেন্ট নেয় না IO- এটি সেই ধরণের একটি মান তৈরি করে।
sepp2k
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.