আপনি কি সি তে ক্রিয়ামূলক প্রোগ্রামিং শিখতে পারেন? [বন্ধ]


9

এখানে মন্তব্য আলোচনার ফলস্বরূপ , আমি ভাবছি আপনি সি তে ফাংশনাল প্রোগ্রামিং শিখতে পারবেন কিনা?


30
আপনি করতে পারেন বা না পারেন তার নিয়ম, আপনার করা উচিত নয়
আর মার্টিনহো ফার্নান্দেস

27
কাফনের কাপড়! প্রথম পদক্ষেপটি হল লিস্পের দোভাষী ;-)
ফারুক্সিও

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

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

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

উত্তর:


21

একথাও ঠিক যে আপনি পারেন না সি তত্ত্ব কার্মিক প্রোগ্রামিং, আপনিও যা করতে পারেন শিখতে সি কার্যকরী প্রোগ্রামিং নীতি, কিন্তু ভাষা সহজে দেখা যায় না।

আমি ধরে নিই যে OOP তে আপনার কমপক্ষে কিছুটা পটভূমি রয়েছে; যদি আপনি এটি করেন তবে আপনার সচেতন হওয়া উচিত যে বহুকর্ম, গিটার / সেটটার্স, দৃশ্যমানতার বিধি ইত্যাদি C সি সহ ওওপি করা যেতে পারে তবে এটি করা মোটামুটি বেদনাদায়ক এবং আপনার ওওপি এবং সি উভয়ই জানতে হবে- এটি টানতে বাইরে। এটি এফপির সাথে অনেকটা একই।

আপনার প্রথমে যা করা উচিত তা হ'ল প্রথমে একটি কার্যকরী প্রোগ্রামিংয়ের ভাষা শিখুন (তাদের বেশিরভাগেরই আশ্চর্যরকম সরল বাক্য গঠন রয়েছে; এটি এমন সিনট্যাক্স নয় যা তাদের শেখা কঠিন করে তোলে) এবং তারপরে আপনার নতুন-অর্জিত জ্ঞানকে আপনি সি লিখার পদ্ধতিতে প্রভাবিত করুন let


অনুরোধ অনুসারে, আপনি কয়েকটি জিনিস এফপি থেকে শিখতে পারেন এবং তারপরে, সি, সি ++ বা জাভা প্রয়োগ করতে পারেন:

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

1
আপনি কীভাবে সি / সি ++ / জাভা প্রোগ্রামাররা এলআইএসপি প্রজ্ঞা থেকে উপকৃত হতে পারেন তার নির্দিষ্ট উদাহরণ সরবরাহ করতে পারেন? এটি তত্ত্বের দিক দিয়ে বোঝায় তবে আমি কংক্রিটের জন্য কিছু খুঁজছি।
কাজ

@ জোব, সেখানে কী কংক্রিট সুবিধা হতে পারে? এটি তাদের মনকে প্রসারিত করে এবং সম্ভবত তাদেরকে অত্যধিক পরিবর্তনশীল অবস্থাকে খারাপ জিনিস হিসাবে ভাবতে বাধ্য করে, আপনি আর কী চাইতে পারেন?
ড্যান_ওয়াটারওয়ার্থ

সুতরাং আমি কি এ থেকে উপসংহারে পৌঁছাতে পারি, যখন সিতে (কিছু) এফপি শিখানো সম্ভব, এটি করার কোনও অর্থ হয় না?
এসবিআই

@ জোব: অনেক বছর আগে যখন আমি এলআইএসপি ছাত্র হিসাবে শিখেছিলাম তখন আমি এফপি শিখেছি। প্রায় এক দশক পরে আমি টেমপ্লেট মেটা-প্রোগ্রামিংয়ে এফপি প্রয়োগ করি।
এসবিআই

1
@ এসবিআই, নতুন ভাষাগুলি এবং ধারণাগুলি শেখার আমার প্রিয় উপায় হ'ল এগুলি প্রয়োগ করে। এবং সি একটি সংকলক বাস্তবায়নের জন্য বেশ শালীন ভাষা। সুতরাং, হ্যাঁ, আপনি সি দিয়ে এফপি শিখতে পারেন
এসকে-যুক্তি

11

কিছু কার্যকরী ধারণা দেওয়ার জন্য সি হ্যাক করা যেতে পারে:

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

আসলে করার শিখতে আপনার সেরা বাজি প্রোগ্রামিং কার্মিক মত বিশিষ্ট কার্যকরী প্রোগ্রামিং ভাষা এক পাতার মর্মর এবং তার উপভাষা ( Clojure , স্কিম ), Erlang এবং Haskell, । এর মধ্যে যে কোনও একটি হ'ল নিখুঁত সরঞ্জাম যা কার্যকরী প্রোগ্রামিং মানসিকতার মধ্যে কাজ করে। আপনার যদি নেট নেট ব্যাকগ্রাউন্ড থাকে তবে এফ # ভাল প্রার্থী, তবে এটি একটি বহু উদাহরণের ভাষা, কঠোরভাবে কার্যকরী প্রোগ্রামিং ভাষা নয়।


হিসাবে tmadmers মন্তব্য মন্তব্য:

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

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


আপনার শেষ বাক্যটি সম্পর্কে: সেই ক্ষেত্রে আমি যুক্তি দেব যে এফ # একটি ভাল প্রার্থী কারণ এটি আপনাকে কার্যকরী মানসিকতায় আটকাবে না। একটি বহু-দৃষ্টান্তের ভাষায়, আপনি যখন হাতুড়ি স্ক্রু শুরু করেন, আপনি কেবল একটি স্ক্রু ড্রাইভারে স্যুইচ করতে পারেন। একক দৃষ্টান্তে আটকা পড়লে আপনি স্ক্রু এবং পেরেকের মধ্যে পার্থক্য মিস করতে পারেন।
আর মার্টিনহো ফার্নান্দিস

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

আমি বিশ্বাস করি যে দৃষ্টান্তটি যখন যথাযথভাবে উপযুক্ত এবং যখন এটি কোনও নির্দিষ্ট কাজের জন্য উপযুক্ত নয় তখন এটি শেখার একটি অংশ, এটি সম্ভবত সবচেয়ে গুরুত্বপূর্ণ learning
আর মার্টিনহো ফার্নান্দেস

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

2
@ মার্টিনহো ফার্নান্দেস: কেউ যুক্তি দিতে পারেন যে কোনও এক দৃষ্টান্তের মধ্যে আটকা পড়ে যাওয়া শেখার সঠিক উপায় এটি যখন পাছায় সত্যিই ব্যথা হয় :-)
জার্গ ডব্লু মিট্টাগ

2

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

http://www.johndcook.com/blog/2011/07/24/get-started-functional-programming/


2

টি এল; ডিআর

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

ফাংশনাল প্রোগ্রামিং কি?

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

ক্লোজারগুলির দরকারীতার তিনটি চিত্র illust

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

create_counter = function()
{
  var x = 0;
  var counter = function()
  {
    ++x;
    return x;
  };
  return counter;
}

তারপরে

a = create_counter();
b = create_counter();

আমাদের দুটি ফাংশন aএবং bগণনা বিরক্তি সংগ্রহ have উদাহরণের বিষয়টি হ'ল ভেরিয়েবলগুলি ক্লোজারটি ক্লোজারটিকে xসংজ্ঞায়িত করে counterএবং প্রতিবার একটি নতুন counterক্লোজার is instantiated by the function, it gets its fresh own idea of whatx` হয় captured

ক্লোজারগুলির আরেকটি সাধারণ ব্যবহার হ'ল ফাংশনগুলির আংশিক প্রয়োগের সংজ্ঞা। ধরে নিন যে আমাদের syslogকোনও ফাংশন বাস্তবায়নের অনুরূপ একটি প্রতিবেদন করার সুবিধা রয়েছে

var log = function(priority, message) {

};

যেখানে আর্গুমেন্ট priorityএবং messageস্ট্রিং হবে বলে আশা করা যায়, প্রথম এক এক হচ্ছে "debug", "info", ইত্যাদি। আমরা এই জাতীয় লগ কারখানাটি সংজ্ঞায়িত করতে পারি:

var logWithPriority = function(priority) {
  return function(message) {
    log(priority, message);
  };
};

এবং আমাদের লগ সুবিধার বিশেষায়িত সংস্করণগুলি সংজ্ঞায়িত করতে এটি ব্যবহার করুন:

var debug = logWithPriority("debug");
var info = logWithPriority("info");

এটি খুব দরকারী, কারণ ত্রুটি-প্রবণ- forলুপগুলি লেখার পরিবর্তে

for(i = 0; i < journal.length; ++i) {
   log("info", journal[i]);
}

আমরা ক্লিনার, খাটো এবং অতিশয় সরল (সেখানে নেই লিখতে পারেন i, যে অনেক ভাল):

journal.forEach(logWithPriority("info"));

ক্লোজারগুলির একটি তৃতীয় গুরুত্বপূর্ণ অ্যাপ্লিকেশন ক্ষেত্র হ'ল অলস মূল্যায়নের প্রয়োগ - নোট করুন যে বিশেষ ভাষা সমর্থন আরও ভাল বাস্তবায়নের জন্য সরবরাহ করতে পারে।

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

ক্লোজারগুলির সাথে কীভাবে অলস মূল্যায়ন কার্যকর করা যায় তা এখানে। অ্যারেতে সর্বোচ্চ ফিরিয়ে দেওয়া অ্যারেম্যাক্স ফাংশনের শাস্ত্রীয় বাস্তবায়ন বিবেচনা করুন :

function arrayMax(array) {
  return array.reduce(function(a, b) {
    return Math.min(a, b);
  };
}

অলস রূপটি হবে:

function arrayMax(array) {
  var memo = null;
  function actuallyCompute() {
    if(memo === null) {
      memo = array.reduce(function(a, b) {
        return Math.min(a, b);
      });
    }
    return memo;
  }
  return actuallyCompute;
}

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

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

উপসংহার

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


1
এই দুর্দান্ত নমুনার জন্য ধন্যবাদ। বিটিডাব্লু, আপনি যেমন ভ্যার তথ্য সংজ্ঞায়িত করেন, এটি জার্নাল.ফোর প্রতিটি (তথ্য) হবে না?
ejaenv

হ্যাঁ, এটি একটি উপযুক্ত বৈকল্পিক হবে! :)
মাইকেল লে বারবিয়ার গ্রেনওয়াল্ড

1

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

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


1

আপনার সি তে ক্রিয়ামূলক প্রোগ্রামিং শিখানো উচিত নয়, তবে কঠোর কার্যকরী ভাষায় (হাস্কেল, ক্যামেল, এরলং, ইত্যাদি)।

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

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

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