পাইথন ফাংশনাল প্রোগ্রামিংয়ের জন্য খুব ভাল নয় কেন? [বন্ধ]


324

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


2
2018 - নারকেল (পাইথনের সংকলনকারী একটি কার্যকরী প্রোগ্রামিং ভাষা) পাইথনের কার্যকরী প্রোগ্রামিং বৃদ্ধি করে। এছাড়াও এখান থেকে আইবিএম প্রবন্ধ এই সিরিজের দেখুন page1 page2 page3
cssyphus

উত্তর:


393

আপনার উল্লেখ করা প্রশ্নটি কোন ভাষাগুলিতে ওও এবং ক্রিয়ামূলক প্রোগ্রামিং উভয় প্রচার করে asks পাইথন ফাংশনাল প্রোগ্রামিং প্রচার করে না যদিও এটি বেশ ভাল কাজ করে works

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

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

পাইথনে আমি যে কার্যকরী জিনিসগুলি মিস করি তা এখানে:


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

5
নিখোঁজ লেজ পুনরাবৃত্তির জন্য +1 - যদিও লুপিং নির্মাণগুলি এটিকে ছাড়িয়ে গেছে, এটি পাইথন এবং স্কিমের মধ্যে যাওয়া অনুপস্থিত something
new123456

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

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

5
আমি বুঝতে পারছি এই 5 বছর বয়সী, কিন্তু ... এই বলে মনে হয় এটা কিছু তোমাকে মিস করি সম্পর্কে আরো মত Haskell, থেকে , থেকে নয় কার্মিক ভাষায় । উদাহরণস্বরূপ, বেশিরভাগ এমএল এবং লিস্প উপভাষা এবং বংশধরদের অটোমেটিক কার্ভিং থাকে না, পয়েন্ট-ফ্রি স্টাইল অত্যধিক ভারবোজ তৈরি করে, অলস তালিকাগুলি না থাকে ইত্যাদি So সুতরাং, যদি অলস তালিকার পরিবর্তে পুনরাবৃত্তিগুলি পাইথনকে একটি খারাপ কার্যকরী ভাষা করে তোলে, তন্ন তন্ন CaML একটি করতে হবে ভয়ানক কার্মিক ভাষা?
এয়ার্নার্ট

4
@ বার্নার্ট: ক্যামেলের অলস তালিকাগুলি ছাড়া প্রতিটি বুলেট পয়েন্ট রয়েছে যা গ্রন্থাগার হিসাবে উপলব্ধ as আমি এই উত্তরটি লেখার সময় মাঝে মাঝে ক্যামেল ব্যবহার করেছি এবং বর্তমানে এফ # ব্যবহার করি। এগুলি উভয়ই খুব সুন্দর কার্যকরী ভাষা।
নাথান শিভলি-স্যান্ডার্স

102

গাইডো এই একটি ভাল ব্যাখ্যা রয়েছে এখানে । এখানে সর্বাধিক প্রাসঙ্গিক অংশ:

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

...

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

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

আমি এটি থেকে দুটি জিনিস টান:

  1. ভাষার স্রষ্টা পাইথনকে সত্যই কার্যকরী ভাষা হিসাবে বিবেচনা করে না। অতএব, "ফাংশনাল-এস্কে" বৈশিষ্ট্যগুলি দেখা সম্ভব, তবে আপনি নিশ্চিতভাবে কার্যক্ষম এমন কোনও কিছু দেখার সম্ভাবনা পাবেন না।
  2. পাইথনের গতিশীল প্রকৃতি আপনি অন্যান্য কার্যকরী ভাষাগুলিতে দেখেন এমন কিছু অপ্টিমাইজেশন বাধা দেয়। মঞ্জুর, লিস্প পাইথনের মতোই গতিশীল (যদি আরও গতিশীল না হয়) তবে এটি কেবল একটি আংশিক ব্যাখ্যা।

8
পাইথনে আপনি টেল কল অপ্টিমাইজেশন ঠিকঠাক করতে পারেন। গাইডো / বুঝতে পারে না।
জুলু

26
মনে হচ্ছে এটি গিডো ভ্যান রসমের কার্যকরী শৈলীর মতো নয় bo
সোভান্তে

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

8
"মঞ্জুর, লিস্প ঠিক ততটাই গতিশীল" -> এবং ঠিক ততটাই জরুরি!
পাইয়ন

6
@ জুলস, পাইথনে টেল কল অপটিমাইজেশন ব্যবহারের জন্য কোনও গাইডলাইন ভাগ করে নিতে আপনি কি আপত্তি করেন? কিছু উত্স একটি পয়েন্টার দরকারী হবে।
ডেভিড 21'99

52

স্কিমটিতে বীজগণিত ডেটা ধরণের বা প্যাটার্নের মিল নেই তবে এটি অবশ্যই কার্যকরী ভাষা। কার্যকরী প্রোগ্রামিং দৃষ্টিকোণ থেকে পাইথন সম্পর্কে বিরক্তিকর জিনিস:

  1. পঙ্গু লাম্বদাস। যেহেতু ল্যাম্বডাস কেবল একটি অভিব্যক্তি ধারণ করতে পারে এবং আপনি কোনও অভিব্যক্তি প্রসঙ্গে খুব সহজেই সবকিছু করতে পারবেন না, এর অর্থ হ'ল "ফ্লাইতে" সংজ্ঞা দেওয়া ফাংশনগুলি সীমাবদ্ধ are

  2. আইএফস হল বিবৃতি, প্রকাশ নয়। এর অর্থ হ'ল, অন্যান্য জিনিসের মধ্যে, আপনার ভিতরে যদি একটি ল্যাম্বডা থাকতে পারে না। (এটি পাইথন ২.৩ এ টেরিনারি দ্বারা স্থির করা হয়েছে তবে এটি দেখতে কুৎসিত দেখাচ্ছে looks)

  3. গাইড ম্যাপ, ফিল্টার এবং একবারে একবারে হ্রাস করার হুমকি দেয়

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


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

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

7
মানচিত্র এবং ফিল্টার তুচ্ছভাবে একটি তালিকা বোঝার দ্বারা প্রতিস্থাপন করা হয়। হ্রাস - প্রায় সর্বদা - এটি এতটা অক্ষম যে এটি একটি জেনারেটরের ফাংশন দিয়ে প্রতিস্থাপন করা উচিত।
এস .লট

13
@ এসলট আপনি কীভাবে জেনারেটরের সাথে হ্রাস প্রতিস্থাপন করবেন?
অ্যান্টিমনি

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

23

আমি পাইথনকে কখনই "ফাংশনাল" বলব না তবে আমি যখন পাইথনে প্রোগ্রাম করি তখন কোডটি প্রায় অবিচ্ছিন্নভাবে কার্যকর হয়।

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


17

এসও-তে "ফাংশনাল" পাইথন প্রশ্নের উত্তর থেকে নেওয়া কোডের একটি টুকরো দিয়ে আমি এটি প্রদর্শন করব

পাইথন:

def grandKids(generation, kidsFunc, val):
  layer = [val]
  for i in xrange(generation):
    layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
  return layer

Haskell,:

grandKids generation kidsFunc val =
  iterate (concatMap kidsFunc) [val] !! generation

এখানে মূল পার্থক্য হল যে Haskell, এর স্ট্যান্ডার্ড গ্রন্থাগার কার্যকরী প্রোগ্রামিং জন্য দরকারী ফাংশন আছে হল: এই ক্ষেত্রে iterate, concatএবং(!!)


7
এখানে একটি ওয়ান-লাইন প্রতিস্থাপন এর grandKids()জেনারেটরের এক্সপ্রেশন সঙ্গে শরীরের: return reduce(lambda a, v: concat((x for x in kidsFunc(v)) for v in a), xrange(generation), [val])
লোয়েকি

6
এবং concatreturn reduce(lambda a, v: (x for v in a for x in kidsFunc(v)), xrange(generation), [val])
এটির একটিরও

9
@ লৌকি: পুনরাবৃত্তি সেই কোডটি উল্লেখযোগ্যভাবে সহজ করে তুলবে, এবং (বাচ্চাদের জন্য এক্স এর জন্য এক্স এর জন্য এক্স ফিন্স) (ভি)) কনক্যাটম্যাপ (KidsFunc) হিসাবে অনেক বেশি পরিষ্কার। পাইথনের দুর্দান্ত উচ্চ-অর্ডার বিল্টিনগুলির অভাব হাস্কেলের তুলনায় সমান কোড ক্রিপ্টিক এবং ভার্বোজ করে।
ফোব

2
কনট্যাট প্রতিস্থাপন করা যেতে পারেitertools.chain.from_iterable
অ্যান্টিমনি

@ সংস্থান: জেনে রাখা ভাল to thx
yairchu

14

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

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

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

আমি নিম্নলিখিতটি কার্যকরী প্রোগ্রামিংয়ের সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য হিসাবে র‌্যাঙ্ক করব: ক) রেফারেনশিয়াল স্বচ্ছতা - আপনি যদি একই বিবৃতিটি অন্য কোনও সময় এবং জায়গায় মূল্যায়ন করেন তবে একই পরিবর্তনশীল মানগুলির সাথে, এটি এখনও একই অর্থ হবে। খ) কোনও পার্শ্ব প্রতিক্রিয়া - আপনি যতক্ষণ হোয়াইটবোর্ডের দিকে তাকাবেন না কেন, অন্য লোকটি অন্য একটি হোয়াইটবোর্ডের দিকে তাকিয়ে থাকা সমীকরণটি ঘটনাক্রমে পরিবর্তন হবে না। গ) ফাংশনগুলিও মান। যা চারপাশে পাস এবং অন্যান্য ভেরিয়েবলের সাথে প্রয়োগ করা যেতে পারে। d) ফাংশন রচনা, আপনি h = g · f করতে পারেন এবং এইভাবে একটি নতুন ফাংশন h (..) সংজ্ঞায়িত করতে পারেন যা g (f (..)) কল করার সমতুল্য।

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

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


2
পাইথনে ফাংশনগুলি প্রথম শ্রেণির।
কার্ল স্মিথ 22

@ কার্লস্মিথ এটি এক, কিন্তু পাইথনের কাছে 3/4 নেই। : - \
আর্য

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

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

এছাড়াও পাইথনের কারিঙ এবং সংমিশ্রণ উভয়ের জন্য সমর্থন রয়েছে তবে ভাষা স্তরে নয়, এটি পরিবর্তে স্ট্যান্ডার্ড লাইব্রেরিতে রয়েছে।
কেভিন

10

পাইথন প্রায় কার্যকরী ভাষা। এটি "ফাংশনাল লাইট"।

এটিতে অতিরিক্ত বৈশিষ্ট্য রয়েছে, তাই এটি কারওর পক্ষে যথেষ্ট খাঁটি নয়।

এটিতে কিছু বৈশিষ্ট্যও নেই, তাই এটি কিছুটির জন্য যথেষ্ট নয়।

অনুপস্থিত বৈশিষ্ট্যগুলি লিখতে তুলনামূলক সহজ। মত পোস্ট চেক আউট এই পাইথন মধ্যে FP উপর।


2
বেশিরভাগ ক্ষেত্রে, আমি এই পোস্টের সাথে একমত তবে পাইথন একটি কার্যকরী ভাষা বলে আমি একমত হতে পারি না। এটি অত্যাবশ্যক প্রোগ্রামিংকে উত্সাহ দেয় এবং আপনি যে "অতিরিক্ত বৈশিষ্ট্যগুলি" উল্লেখ করেন তা না করাই কঠিন। আমি মনে করি আপনি অন্য পোস্টে যেমন পাইথনকে "ফাংশনাল লাইট" হিসাবে উল্লেখ করা ভাল best :-)
জেসন বেকার

8
-1 দুঃখিত, না। মানে, ঠিক, না। কার্যকরী ভাষাগুলি এমন কাঠামো সরবরাহ করে যা আনুষ্ঠানিক যুক্তির সুবিধার্থে: প্রবর্তক (এমএল), সমীকরণ (হাস্কেল)। বন্ধ এবং অনামী ফাংশনগুলি কেবল কৌশল বিন্যাসের জন্য কেবল সিনট্যাকটিক চিনি।
পাইয়ন

8

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


4

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

যাইহোক এটি দেখা যাচ্ছে যে map( foo() , x ) * map( foo(), y )হিসাবে একই map( foo(), x * y )। পরবর্তী ঘটনাটি প্রকৃতপক্ষে পূর্বের তুলনায় দ্রুত হয় কারণ প্রাক্তন দুটি কপি সম্পাদন করে যেখানে পরবর্তীকৃত একটি সম্পাদনা করে।

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


map( foo() , x ) * map( foo(), y ) == map( foo(), x * y )সমস্ত ফাংশন জন্য সত্য নয়। উদাহরণস্বরূপ, fooএকটি ডেরাইভেটিভ গণনা করার সময় কেসটি বিবেচনা করুন ।
এলি করভিগো

1
আমি মনে করি +পরিবর্তে সে বোঝাতে চেয়েছিল *
ব্যবহারকারী1747134

আপনি ধরে নিচ্ছেন foo () রৈখিক?
জুয়ান ইসাজা

foo (x) = x + 1 এর জন্য এই সম্পত্তিটি সত্য নয়। যেমন (x + 1) * (y + 1)! = X * y + 1.
জুয়ান ইসাজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.