গ্রোভি আংশিক অ্যাপ্লিকেশনটিকে 'কারিঙ' বলছে?


15

গ্রোভির একটি ধারণা আছে যা এটি 'কারিঙ' বলে। এখানে তাদের উইকি থেকে একটি উদাহরণ:

def divide = { a, b -> a / b }

def halver = divide.rcurry(2)

assert halver(8) == 4

এখানে কী চলছে সে সম্পর্কে আমার বুঝতে হবে যে ডান হাতের যুক্তিটি 2 divideমানকে আবদ্ধ করা হচ্ছে এটি আংশিক প্রয়োগের একটি রূপের মতো বলে মনে হচ্ছে।

কারিঙ শব্দটি সাধারণত একটি ফাংশনকে রূপান্তরিত করার অর্থ ব্যবহৃত হয় যা একটি ক্রিয়াকলাপে একটি সিরিজ আর্গুমেন্ট গ্রহণ করে যা কেবল একটি যুক্তি নেয় এবং অন্য ফাংশন ফিরিয়ে দেয়। উদাহরণস্বরূপ, এখানে curryহাস্কেলের ফাংশনটির ধরণটি রয়েছে:

curry :: ((a, b) -> c) -> (a -> (b -> c))

যারা Haskell, ব্যবহার করেন নি জন্য a, bএবং cসব জেনেরিক পরামিতি। curryদুটি যুক্তি সহ একটি ফাংশন নেয় aএবং একটি ফাংশন দেয় যা থেকে কোনও ফাংশন নেয় এবং ফেরত দেয়b দেয় c। এটিকে আরও স্পষ্ট করতে আমি টাইপের সাথে আরও একটি বন্ধনী যুক্ত করেছি।

গ্রুভির উদাহরণে কী চলছে তা আমি ভুল বুঝেছি বা এটি কেবল আংশিক প্রয়োগের ভুল নামকরণ করা হয়েছে? বা এটি উভয়ই করে: এটি divideএকটি তরকারী ফাংশনে রূপান্তর বলতে এবং তারপরে আংশিকভাবে 2এই নতুন ফাংশনে প্রয়োগ করতে হয়।


উত্তর:


14

গ্রোভির বাস্তবায়ন curryকোনও পয়েন্টে বাস্তবে কারি করে না, এমনকি পর্দার আড়ালেও। এটি আংশিক প্রয়োগের জন্য মূলত অভিন্ন।

curry, rcurryএবং ncurryপদ্ধতি একটি ফিরতি CurriedClosureবস্তুর যে বাউন্ড আর্গুমেন্ট ঝুলিতে। এটিরও একটি পদ্ধতি রয়েছেgetUncurriedArguments (ভুল নাম দেওয়া হয়েছে — আপনি তর্কগুলি নয়, যুক্তিগুলি নয়) যা এতে যুক্ত আর্গুমেন্টের সাথে যুক্ত আর্গুমেন্টগুলির সংমিশ্রণটি ফিরিয়ে দেয়।

যখন কোনও ক্লোজর ডেকে আনা হয়, শেষ পর্যন্ত সেই invokeMethodপদ্ধতিটিMetaClassImpl কল করে , যা কলিং অবজেক্টের উদাহরণ কিনা তা স্পষ্টভাবে পরীক্ষা করে CurriedClosure। যদি তা হয় তবে এটি getUncurriedArgumentsপ্রয়োগের জন্য যুক্তিগুলির সম্পূর্ণ অ্যারে রচনা করতে পূর্বোক্তটিকে ব্যবহার করে :

if (objectClass == CurriedClosure.class) {
    // ...
    final Object[] curriedArguments = cc.getUncurriedArguments(arguments);
    // [Ed: Yes, you read that right, curried = uncurried. :) ]
    // ...
    return ownerMetaClass.invokeMethod(owner, methodName, curriedArguments);
}

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

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

এটি বলার অপেক্ষা রাখে না যে কল করার ফলাফল curryপ্রকৃত তরকারী থেকে সম্পূর্ণ পৃথক। যদি এটি সত্যিই ফাংশনটি তদন্ত করে থাকে তবে আপনি লিখতে সক্ষম হবেন:

def add = { x, y -> x + y }
def addCurried = add.curry()   // should work like { x -> { y -> x + y } }
def add1 = addCurried(1)       // should work like { y -> 1 + y }
assert add1(1) == 2 

... এবং এটি কাজ করবে, কারণ এটির addCurriedমতো কাজ করা উচিত { x -> { y -> x + y } }। পরিবর্তে এটি একটি রানটাইম ব্যতিক্রম ছুঁড়ে দেয় এবং আপনি কিছুটা ভিতরে মারা যান।


1
আমি মনে করি আর্গুমেন্ট> 2 সহ ফাংশনগুলিতে rcurry এবং ncurry দেখায় যে এটি সত্যিই আংশিক অ্যাপ্লিকেশনটি কারি হচ্ছে না
জে কে।

@ জে কে প্রকৃতপক্ষে, এটি আর্গুমেন্টগুলি == 2 সহ ফাংশনগুলিতে প্রদর্শনযোগ্য, যেমন আমি শেষের দিকে লক্ষ্য করেছি। :)
জর্ডান গ্রে

3
@ ম্যাটকাউথন কঠোরভাবে বলতে গেলে, কারিঙের "উদ্দেশ্য" হ'ল বহু যুক্তিযুক্ত একটি ফাংশনকে প্রতিটি যুক্তির সাথে ফাংশনের নেস্টেড চেইনে রূপান্তর করা। আমার মনে হয় আপনি কারিগরী ব্যবহার করতে চান এমন ব্যবহারিক কারণ যা আপনি গ্রোভিতে যেমন এলআইএসপি বা হাস্কেলের চেয়ে ন্যায্যতা প্রমাণ করা কিছুটা কঠিন। মুল বক্তব্যটি হ'ল আপনি যা বেশিরভাগ সময় ব্যবহার করতে চান তা হ'ল আংশিক প্রয়োগ, কার্চিং নয়।
জর্ডান গ্রে

4
+1 এর জন্যand you die a little inside
থমাস এডিং

1
বাহ, আমি আপনার উত্তরটি পড়ার পরে আরও ভালভাবে তরকারি বুঝতে পেরেছি: +1 এবং ধন্যবাদ! এই প্রশ্নের সাথে সম্পর্কিত, আমি আপনার পছন্দ মতো বলেছি যে "আংশিক প্রয়োগের সাথে কার্য়েটে জড়িত"।
গ্লেনপিটারসন

3

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

f :: (a,b,c) -> d

এর তরকারিযুক্ত ফর্ম হবে

fcurried :: a -> b -> c -> d

তবে গ্রোভির তরকারী সমান কিছু ফেরত দেবে (ধরে নেওয়া হচ্ছে 1 টি আর্গুমেন্ট x দিয়ে কল করা)

fgroovy :: (b,c) -> d 

যা এক্সকে নির্ধারিত মানের সাথে কল করবে

যেমন গ্রোভির তরকারি N-1 টি যুক্তি দিয়ে ফাংশন ফিরিয়ে দিতে পারে, ততক্ষণ সঠিকভাবে শুধুমাত্র 1 টি যুক্তি থাকে তাই গ্রোভির তরকারী দিয়ে কারি করা যায় না


2

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

http://groovy.markmail.org/thread/c4ycxdzm3ack6xxb

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

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


1

আইবিএম-এ পাওয়া এই সংজ্ঞাটি দেওয়া:

কারি শব্দটি আংশিক কার্যকারিতা ধারণার বিকাশকারী গণিতবিদ হাস্কেল কারির কাছ থেকে নেওয়া হয়েছে। কারিঙ বলতে বোঝায় একাধিক যুক্তি একটি ফাংশনে নেওয়া যা অনেকগুলি আর্গুমেন্ট গ্রহণ করে, যার ফলে একটি নতুন ফাংশন হয় যা বাকী আর্গুমেন্ট গ্রহণ করে এবং ফলাফল দেয় returns

halverআপনার নতুন (তরকারি) ফাংশন (বা বন্ধ), যা এখন কেবল একটি পরামিতি নেয়। কলিং এর halver(10)ফলাফল হবে 5।

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


4
আইবিএমের সংজ্ঞাটি ভুল। তারা তরকারী হিসাবে যা সংজ্ঞায়িত করে তা হ'ল আংশিক ফাংশন অ্যাপ্লিকেশন, যা কোনও ক্রিয়াকলাপকে সংশোধন করে যুক্তিগুলি সংশোধন করে ছোট তাত্পর্য সহ function কারি করানো একটি ফাংশনকে রূপান্তর করে যা একাধিক যুক্তিগুলি ফাংশনের একটি শৃঙ্খলে নিয়ে যায় যা প্রত্যেকে একটি করে আর্গুমেন্ট নেয়।
জর্ডান গ্রে

1
উইকিপিডিয়ায় নির্ধারিত আইবিএম-এর মতোই: গণিত এবং কম্পিউটার বিজ্ঞানে কারি করানো এমন একটি ফাংশনকে রূপান্তর করার কৌশল যা একাধিক যুক্তি (বা যুক্তিগুলির একটি এন-টুপল) এমনভাবে গ্রহণ করে যে একে বলা যেতে পারে একক যুক্তি (আংশিক প্রয়োগ) সহ প্রতিটি ফাংশনের শৃঙ্খলা। গ্রোভি একটি ফাংশন (দুটি যুক্তি সহ) rcurryফাংশনটির সাথে (যা একটি যুক্তি নেয়) একটি ফাংশনে রূপান্তরিত করে (এখন কেবলমাত্র একটি যুক্তি দিয়ে)। আমি আমার ফলাফল ফাংশন পেতে আমার বেস ফাংশন একটি তর্ক সঙ্গে কারি ফাংশন শৃঙ্খলিত।
ম্যাটকাঠন

3
না, উইকিপিডিয়া সংজ্ঞাটি আলাদা - আংশিক প্রয়োগ হ'ল আপনি যখন কারিড ফাংশনটি কল করেন - যখন আপনি এটি সংজ্ঞায়িত করেন না যা গ্রোভির কাজটি করে
জে.কে.

6
@ জে কে সঠিক। উইকিপিডিয়া ব্যাখ্যাটি আবার পড়ুন এবং আপনি দেখতে পাবেন যে যা ফিরে আসে তা হ'ল যুক্তিযুক্ত একটি ফাংশন নয়, প্রতিটি যুক্তির একটি ক্রিয়াকলাপ n - 1। আমার উত্তরের শেষে উদাহরণটি দেখুন; পার্থক্য তৈরি করার বিষয়ে আরও তথ্যের জন্য নিবন্ধে পরে দেখুন। en.wikedia.org/wiki/…
জর্ডান গ্রে

4
এটা খুব তাৎপর্যপূর্ণ, বিশ্বাস করুন। আবার, আমার উত্তরের কোডটি দেখায় যে কীভাবে একটি বাস্তবায়ন কার্যকর হবে; এটি একটি জিনিস জন্য কোন যুক্তি নিতে হবে। বর্তমান বাস্তবায়ন যেমন নামকরণ করা উচিত partial
জর্ডান গ্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.