জাভাতে কি কার্যকরী প্রোগ্রামিং সম্ভব? [বন্ধ]


42

আমি অ্যামাজন ডটকমের বইয়ের দোকানে ব্রাউজ করছি এবং আমি "জাভা ডেভেলপারদের জন্য ফাংশনাল প্রোগ্রামিং" বইটি পেয়েছি ।

আমি কিছু খুব বেসিক ফাংশনাল প্রোগ্রামিং জানি এবং 3 বছর ধরে জাভাতে প্রোগ্রামিং করছি।

আমি জানতে চাই যে ফাংশনাল প্রোগ্রামিং জাভাতেও সম্ভব?


2
শৈলী সম্ভব কিন্তু তার ভারবোসিটি অত্যধিক জাভার বাক্য গঠন দেওয়া বহন করতে হতে পারে: functionaljava.org
Yuriy Zubarev

7
@nCdy JRuby কে চেক করবেন কেন? আরও ব্যাখ্যা প্রদান করুন।
চিরন

1
গ্রোভি পরীক্ষা করুন :-)
পিপীলিকার

6
আমি মনে করি এটি এই জাতীয় প্রশ্ন যা জাভা-ভাষা এবং জাভা-দ্য প্ল্যাটফর্মের মধ্যে পার্থক্য উত্থাপন করে।
থমাস ওয়ানস

2
@ থরবজর্নআরএনএন্ডারসন: "অলস মূল্যায়ন" দ্বারা "ফাংশনাল প্রোগ্রামিং" সংজ্ঞায়িত করা আপনার কী মনে হয়? এটি বাছাই করার জন্য এটি একটি অদ্ভুত উদাহরণ বলে মনে হচ্ছে ...
জন বার্থোলোমিউ

উত্তর:


70

"ফাংশনাল প্রোগ্রামিং" এবং "সম্ভাব্য" দ্বারা আপনি কী বোঝাতে চান তা এটি নির্ভর করে।

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

একইভাবে, আপনি সি-এর মতো অ-ওও হিসাবে স্বীকৃত কোনও ভাষায় অবজেক্ট-ওরিয়েন্টেড কোড লিখতে পারেন C.

জাভা লাইব্রেরি

এমন লাইব্রেরি রয়েছে যা ইতিমধ্যে আপনার জন্য লেগ ওয়ার্ক করে এবং তীরচিহ্নগুলি লুকিয়ে রেখে আপনাকে এটি করতে সহায়তা করতে পারে:

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

জেভিএম ভাষা

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

উদাহরণস্বরূপ, চেক আউট:

কম বা কম কার্যকরী জেভিএম ভাষা

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

আরও পড়া

আপনি এই নিবন্ধগুলি বা ভিডিওগুলি পড়তে বা দেখতে চাইতে পারেন:


2
ক্লোজার সোর্স কোডটি এখন গিথুব github.com/clojure/clojure-
চিরন

@ দ্য কিংবদন্তি 1982: আমি আপনার মন্তব্যের চেয়ে দ্রুত ছিলাম, আমি ইতিমধ্যে অফিসিয়াল ক্লোজিউর.অর্গ সাইটটিতে লিঙ্কটি পরিবর্তন করেছি :) তবে এত তাড়াতাড়ি ধরার জন্য ধন্যবাদ! লোকেরা দ্রুত প্রতিক্রিয়া দেখায় ভাল।
হাইলেম 16'11

এটিবিসিএলও রয়েছে ( কমন -લિস্প.কম / প্রজেক্ট / আর্মডবার ), তবে আমি বুঝতে পারি না এটি কোথায় পরিণত / কোন পরিপক্ক স্কেলের উপর পড়ে এবং এটি একটি সাধারণ লিস্প বাস্তবায়ন।
ভ্যাটাইন

@ ভ্যাটাইন: আকর্ষণীয়, একেবারেই এটি কখনও শুনেনি। একটি তাত্ক্ষণিক চেহারা আছে এবং এটি যোগ করা হবে।
হাইলেম

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

11

আপনার উল্লিখিত বইটি পড়ছি। এটি সত্যিই ভাল বিটিডাব্লু।

হ্যাঁ জাভাতে এটি কার্যকর হতে পারে। আপনি কোন ডিগ্রীতে এটি অর্জন করতে পারবেন তা আমি জানি না তবে আপনি অনেকগুলি কার্যকরী প্রোগ্রামিং আইডিয়ামগুলি প্রয়োগ করতে পারেন।

সর্বাধিক গুরুত্বপূর্ণ বিষয়গুলির মধ্যে একটি "মানসিকতা পরিবর্তন করবেন না" মানসিকতার সাথে কোড করার চেষ্টা করা হচ্ছে।

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

সমবর্তী প্রোগ্রামিংয়ের জন্যও আপনি আক্কা কাঠামোর উপর নির্ভর করতে পারেন (অভিনেতার মডেল)।

এটি উল্লেখ করার মতো যে জেভিএম বাইটকোড টেল-কল অপটিমাইজেশন সমর্থন করে না (কমপক্ষে এখনও) ফাংশনাল প্রোগ্রামিং ভাষার জন্য একটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য।


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

@ জর্জিও: স্কাইল সংকলনের সময় টিসিও করে।
scrwtp

@ এসএসআরডব্লিউপিপি: এর কারণে কোনও পারফরম্যান্স পেনাল্টি আছে কি? বা কম্পাইল-টাইম টিসিওর অসুবিধাগুলি কী?
জর্জিও

@ জর্জিও: আমার অর্থ হ'ল জাভা বাইটকোড এটিকে স্থানীয়ভাবে সমর্থন করে না, ঠিক যেমন চিরন মূলত বলেছিল stated কার্যকরী ভাষাগুলি এর চারপাশে কাজ করে, লুপগুলিতে লেজ-পুনরাবৃত্তি কলগুলি সংকলন করে, তবে এটি ভাষা-> বাইটকোড সংকলক, জেভিএম নয়, এর বৈশিষ্ট্য।
scrwtp

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

6

হ্যাঁ, এটা স্পষ্টভাবে হয় সম্ভব এটি কোন টুরিং-সম্পূর্ণ ভাষা / সঞ্চালনের পরিবেশ একযোগে সম্ভব একই ভাবে। আপনি কী করছেন তা যদি আপনি জানেন তবে আপনি এটি বেশ ভাল পারফর্ম করতে পারেন get

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

আপনি কিছু বিজোড় বর্ণন কোডটি শেষ করবেন, যেমন একটি নতুন ফাংশন সংজ্ঞায়িত করতে:

Function twoStrings=new Function() {
  public Object apply(Object param1) {
    // do something to param1 and return a result
  }
}

ক্রিয়ামূলক প্রোগ্রামিং করতে আপনার সাধারণত প্রয়োজন:

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

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

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


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

4

জাভাতে কিছুটা কার্যকর হতে পারে। এটি করা গুরুতরভাবে বেদনাদায়ক । পরিবর্তে

myList.each { doSomething(it); }

আপনার মত কিছু আছে:

myList.each(new Function() { public void do(Object arg) { something(); }})

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


কার্যকরী প্রোগ্রামিং বেনাম ক্লাসের পরিবর্তে ব্লক ব্যবহার করা সম্পর্কে নয়। জাভা 8 এর ব্লক রয়েছে, সুতরাং আপনার পোস্ট কোডটি আরও মার্জিত দেখাচ্ছে তবে এটি কার্যকরী প্রোগ্রামিং হতে চলেছে না।
চিরন

@ কিংবদন্তি: আমি এটি বুঝতে পেরেছি, তবে স্পষ্টতই এটি ভালভাবে ব্যাখ্যা করতে পারেনি।
কেভিন

এটি পর্যবেক্ষণ / অন্তর্দৃষ্টি। যে কোনও ভাষার সাথে, আপনাকে ফাংশনটি সোমবারই সংজ্ঞায়িত করতে হবে, আপনি সেই অংশটি এড়িয়ে যেতে পারবেন না। তাই জাভা প্রায় সংক্ষিপ্ত, আপনাকে যা করতে হবে তা হ'ল ফাংশন অবজেক্টটিকে অননুমুক্ত করে তোলা। আপনি এটি করতে পারেন: ফাংশন এফ = নতুন ফাংশন () {পাবলিক বায়োড ডো () {}}; .... তারপরে ... সেই ফাংশনটি কল করুন .... myMethodToCallAFunction (ফাংশন চ) {f.do ()} ... এটি, ব্রোস এবং ব্রোলিনিস। এর মোকাবেলা কর.
আলেকজান্ডার মিলস

3

উত্তরটি হ'ল "হ্যাঁ, অবশ্যই", তবুও আমার মতে অনেক কার্যকরী ভাষার অন্যতম গুরুত্বপূর্ণ বৈশিষ্ট্য হ'ল দুর্দান্ত টাইপ সিস্টেম। আপনি নিজে জাভাতে এটি পরিচালনা করতে পারবেন না।

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


2

ভাল, সব ধরণের জিনিসই সম্ভব। সিতে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং করা সম্ভব; এটা ঠিক খুব ভাল ধারণা নয়।

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


0

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


-3

এটি সম্ভব বলে মনে হচ্ছে তবে এটি খাঁটি কার্যকরী প্রোগ্রামিং হবে না। এটি অত্যাবশ্যক প্রোগ্রামিংয়ের ফলাফল হতে পারে।

হাইলেমের দ্বারা বর্ণিত সম্ভাব্য কার্যকরী প্রোগ্রামিংয়ের অর্থ কেন তিনি জিজ্ঞাসা করছেন না । এটা এখানে:

"ফাংশনাল প্রোগ্রামিং" এবং "সম্ভাব্য" দ্বারা আপনি কী বোঝাতে চান তা এটি নির্ভর করে।

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

যখন আমরা ফাংশনাল অর্থ বলি প্রোগ্রামগুলিতে ফাংশন থাকে।
ফাংশনগুলির ভূমিকা হ'ল মূল্যায়ন যুক্তি / প্যারামিটার ফিরিয়ে আনা (আর্গুমেন্টটি ভেরিয়েবল হয় ফাংশনটি কল করার সময় উপস্থিত হয় এমন প্যারামিটারটি ভেরিয়েবল যা ফাংশন ঘোষণার অংশ)।

এছাড়াও একই আর্গুমেন্টগুলি পাস করার পরে ফাংশনগুলি সর্বদা একই ফল দেয়। এইভাবে বাগগুলি এড়াতে বা ভবিষ্যতের বাগগুলি ডিবাগ করা সহজ। ফাংশনাল প্রোগ্রামিং দ্বারা আমরা গ্লোবাল ভেরিয়েবল পরিবর্তন করার মতো পার্শ্ব প্রতিক্রিয়া এড়াতে পারি।

জাভাস্ক্রিপ্ট উদাহরণ:

function increment(lis){
    return lis.map(
        function (x){
            return x+2;
        }
    );
}

var myList = [4, 7, 2, 3];
console.log(increment(myList));
console.log(myList);

ফাংশন ইনক্রিমেন্ট বস্তুর অভ্যন্তরের প্রতিটি উপাদানকে 1 টি মান যুক্ত করে ফলাফলটি ফেরত দেয়। মাইলিস্টের মান পরিবর্তন হয়নি তবে আমরা যখন ফাংশনগুলি কল করি তখন আমরা সেই অবজেক্টের উপাদানগুলিতে যুক্ত হওয়া মান দেখেছিলাম।

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

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