ক্রিয়ামূলক প্রোগ্রামিংয়ে "স্মরণ" মান values


20

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

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

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

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

(নিম্নলিখিতটি সমস্ত সিউডোকোড)

f(x,y) {
  int z = x;
  for(int i = 0, i < y; i++){
    x = x * z;
  }
  return x;
}

ক্রিয়ামূলক প্রোগ্রামিংয়ে আমি নিশ্চিত ছিলাম না। এটিই আমি নিয়ে এসেছি:

f(x,y,z){
  if z == 'null',
    f(x,y,x);
  else if y > 1,
    f(x*z,y-1,z);
  else
    return x;
}

এটা কী ঠিক? zউভয় ক্ষেত্রেই আমার একটি মান রাখা দরকার , তবে ফাংশন প্রোগ্রামিংয়ে এটি কীভাবে করা যায় তা সম্পর্কে আমি নিশ্চিত ছিলাম না। তত্ত্বগতভাবে, আমি এটি যেভাবে করেছি তা কার্যকর হয়েছে তবে আমি এটি নিশ্চিত ছিলাম না যে এটি 'সঠিক' ছিল কিনা। এটা করতে একটি ভাল উপায় আছে কি?


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

12
বাস্তব প্রচেষ্টা বিবেচনা করার সময় আপনার প্রচেষ্টা আসলে বেশ ভাল। আপনার সমস্ত পুনরাবৃত্ত কলগুলি টেল কল , অর্থাৎ ফাংশন তাদের কল করার পরে আর কিছুই করে না। এর অর্থ হ'ল একটি সংকলক বা দোভাষী যা এটি সমর্থন করে তাদের অনুকূলিত করতে পারে যাতে আপনার পুনরাবৃত্ত ফাংশনটি একটি আনুপাতিক পরিমাণের চেয়ে স্থির পরিমাণের স্ট্যাক মেমরি ব্যবহার করে y
বিট্রি

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

5
আপনি কোন ভাষায় কোডটি লেখার পরিকল্পনা করছেন? আপনি যে ভাষাটি ব্যবহার করছেন তা উপযুক্ত নয় এমন একটি শৈলী ব্যবহার করার চেষ্টা করবেন না।
কার্স্টেন এস

2
সম্ভবত দরকারী: en.wikipedia.org/wiki/Memoization
ইথান Bolker

উত্তর:


37

সবার আগে, "আলো দেখে" অভিনন্দন। আপনি নিজের দিগন্তগুলি প্রসারিত করে সফ্টওয়্যার বিশ্বকে আরও ভাল জায়গা করে নিয়েছেন।

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

বর্ণিত প্রশ্নের সমাধান করতে: যদি আপনার অপরিহার্য কোডটি একটি লুপ ব্যবহার করে, তবে আপনার কার্যকরী কোডটি পুনরাবৃত্ত হওয়ার সম্ভাবনা রয়েছে।

(* raises x to the power of y *)
fun pow (x: real) (y: int) : real = 
    if y = 1 then x else x * (pow x (y-1))

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

পার্শ্ব নোট হিসাবে z, আসলে আপনার অপরিহার্য বা কার্যকরী কোডের কোনও মানের প্রয়োজন নেই । আপনার মতো করে আপনার আবশ্যকীয় কাজটি লেখা উচিত ছিল:

def pow(x, y):
    var ret = 1
    for (i = 0; i < y; i++)
         ret = ret * x
    return ret

পরিবর্তে ভেরিয়েবলের অর্থ পরিবর্তন করা x


আপনার পুনরাবৃত্তি powবেশ সঠিক নয়। এটি হিসাবে , পরিবর্তে , pow 3 3ফিরে । এটি হওয়া উচিত8127else x * pow x (y-1).
বিট্রি

3
উফফফফ, সঠিক কোড লেখা শক্ত :) ফিক্সড, এবং আমি টাইপ টিকাও যুক্ত করেছি। @ ইউসেনা এটি এসএমএল হওয়ার কথা, তবে আমি এটি কিছুক্ষণ ব্যবহার করিনি যাতে আমার বাক্য গঠনটি কিছুটা ভুল হতে পারে। কোনও ক্রিয়াকলাপটি ঘোষণার অনেকগুলি উপায় আছে, আমি কখনই সঠিক কীওয়ার্ডটি মনে করতে পারি না। সিনট্যাক্স পরিবর্তনের পাশাপাশি কোডটি জাভাস্ক্রিপ্টে অভিন্ন।
বাগানের মাথা

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

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

1
জনপ্রিয়তা একটি ভয়াবহ মেট্রিক, এ কারণেই যখনই কেউ উল্লেখ করেন যে ভাষা বা সরঞ্জাম এক্স অবশ্যই ভাল হতে পারে কারণ এটি এত বেশি ব্যবহৃত হয় আমি জানি যে যুক্তিটি চালিয়ে যাওয়া অর্থহীন হবে। আমি ব্যক্তিগতভাবে হাস্কেলের চেয়ে ভাষার এমএল পরিবারের সাথে বেশি পরিচিত। তবে আমি এটি সত্য কিনা তাও নিশ্চিত নই; আমার ধারণা হ'ল বিপুল সংখ্যক বিকাশকারী হাস্কেলকে প্রথম স্থানে চেষ্টা করেন নি।
বাগান মাথা

33

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

ফাংশনাল প্রোগ্রামিংয়ে, ভাঁজ হ'ল প্রতিটি ক্রিয়াকলাপের মধ্যে একটি মান "মনে রাখে" এমন একটি মানকে একত্রিত করার উপায়। জরুরীভাবে সংখ্যার একটি তালিকা যুক্ত বিবেচনা করুন:

def sum_all(xs):
  total = 0
  for x in xs:
    total = total + x
  return total

আমরা মান একটি তালিকা নেওয়া xsএকটি এবং প্রাথমিক অবস্থায় এর 0(দ্বারা প্রতিনিধিত্ব totalএই ক্ষেত্রে)। তারপরে, প্রত্যেকটির xজন্য xs, আমরা কিছু সংযোজন পরিচালনা (এই ক্ষেত্রে সংযোজন) অনুযায়ী বর্তমান রাষ্ট্রের সাথে সেই মানটি একত্রিত করি , এবং ফলাফলটিকে নতুন রাজ্য হিসাবে ব্যবহার করি । সংক্ষেপে, সমতুল্য । এই প্যাটার্নটি একটি উচ্চতর ক্রিয়াকলাপে বের করা যেতে পারে , এমন একটি ফাংশন যা ফাংশনকে আর্গুমেন্ট হিসাবে গ্রহণ করে:sum_all([1, 2, 3])(3 + (2 + (1 + 0)))

def fold(items, initial_state, combiner_func):
  state = initial_state
  for item in items:
    state = combiner_func(item, state)
  return state

def sum_all(xs):
  return fold(xs, 0, lambda x y: x + y)

এই বাস্তবায়ন foldএখনও আবশ্যক, তবে এটি পুনরাবৃত্তভাবেও করা যেতে পারে:

def fold_recursive(items, initial_state, combiner_func):
  if not is_empty(items):
    state = combiner_func(initial_state, first_item(items))
    return fold_recursive(rest_items(items), state, combiner_func)
  else:
    return initial_state

ভাঁজ শর্তে প্রকাশিত, আপনার ফাংশন সহজ:

def exponent(base, power):
  return fold(repeat(base, power), 1, lambda x y: x * y))

... যেখানে অনুলিপিগুলির repeat(x, n)একটি তালিকা ফিরে আসে ।nx

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


8
কোনও সমস্যা যখন কোনও ভাঁজ বা মানচিত্রের মাধ্যমে সমাধান করা যায় অবশ্যই স্পষ্টভাবে শিখুন। এফপিতে প্রায় সমস্ত লুপগুলি ভাঁজ বা মানচিত্র হিসাবে প্রকাশ করা যেতে পারে; সুতরাং সুস্পষ্ট পুনরাবৃত্তি সাধারণত প্রয়োজন হয় না।
কারসিজেনিকেট

1
কিছু ভাষায়, আপনি কেবল লিখতে পারেনfold(repeat(base, power), 1, *)
ব্যবহারকারী 253751

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

4
@ রিকো কাহেলার এবং যতদূর আমি বলতে পারি, হ্রাস এবং ভাঁজগুলি একই জিনিস। হাস্কেল "ভাঁজ" শব্দটি ব্যবহার করেছেন, যখন ক্লোজিউর "হ্রাস" পছন্দ করেন। তাদের আচরণ আমার কাছে একই রকম মনে হয়।
কারসিজেনিকেট

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

8

মানচিত্র এবং ভাঁজগুলি ব্যাখ্যা করার জন্য এটি একটি পরিপূরক উত্তর। নীচের উদাহরণগুলির জন্য, আমি এই তালিকাটি ব্যবহার করব। মনে রাখবেন, এই তালিকাটি পরিবর্তনযোগ্য, তাই এটি কখনই পরিবর্তন হবে না:

var numbers = [1, 2, 3, 4, 5]

আমি আমার উদাহরণগুলিতে সংখ্যাগুলি ব্যবহার করব কারণ তারা কোড পড়তে সহজ করে। তবে মনে রাখবেন, sতিহ্যগত অপরিহার্য লুপটি যে কোনও জিনিসের জন্য ভাঁজগুলি ব্যবহার করা যেতে পারে।

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

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

function add-two(n):
    return n + 2

var numbers2 =
    map(add-two, numbers) 

আপনি যদি মুদ্রিত হন তবে আপনি প্রতিটি উপাদানের সাথে 2 যোগ করে প্রথম তালিকাটি numbers2দেখতে পাবেন [3, 4, 5, 6, 7]। খেয়াল করুন ফাংশনটি ব্যবহারের জন্য add-twoদেওয়া হয়েছিল map

ভাঁজ গুলি সমান, আপনার যে ফাংশনটি দেওয়ার প্রয়োজন তা বাদ দিয়ে অবশ্যই তাদের 2 টি আর্গুমেন্ট নিতে হবে। প্রথম যুক্তিটি সাধারণত সংগ্রহকারী হয় (বাম ভাঁজে, যা সবচেয়ে সাধারণ)। লুপিংয়ের সময় পাস করা ডেটা হ'ল সংযোজক। দ্বিতীয় যুক্তি তালিকার বর্তমান আইটেম; ঠিক উপরের মত mapফাংশন।

function add-together(n1, n2):
    return n1 + n2

var sum =
    fold(add-together, 0, numbers)

আপনি মুদ্রিত sumহলে সংখ্যার তালিকার যোগফল দেখতে পাবেন: 15।

যুক্তিগুলি কী করতে হবে তা এখানে রয়েছে fold:

  1. এটি ফাংশন যা আমরা ভাঁজ দিচ্ছি। ভাঁজটি বর্তমান সঞ্চালক এবং তালিকার বর্তমান আইটেমটি ফাংশনটি পাস করবে। ফাংশনটি যাই হোক না কেন নতুন সংযোজক হয়ে যাবে, যা পরের বারে ফাংশনে পাঠানো হবে। আপনি যখন এফপি-স্টাইলটি লুপ করছেন তখন এইগুলি আপনি "স্মরণ" করবেন। আমি এটি একটি ফাংশন দিয়েছি যা 2 নম্বর নেয় এবং তাদের যুক্ত করে।

  2. এটি প্রাথমিক সংগ্রহকারী; তালিকার যে কোনও আইটেম প্রক্রিয়াজাতকরণের আগে যেমন সঞ্চয়ের শুরু হয়। যখন আপনি সংখ্যার সংমিশ্রণ করবেন, আপনি কোনও সংখ্যার একসাথে যুক্ত করার আগে মোটটি কত? 0, যা আমি দ্বিতীয় যুক্তি হিসাবে পাস করেছি।

  3. শেষ পর্যন্ত, মানচিত্রের মতো আমরা এটির প্রক্রিয়া করার জন্য সংখ্যার তালিকায়ও পাস করি।

যদি ভাঁজগুলি এখনও বোঝায় না, এটি বিবেচনা করুন। আপনি যখন লিখবেন:

# Notice I passed the plus operator directly this time, 
#  instead of wrapping it in another function. 
fold(+, 0, numbers)

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

[1, 2, 3, 4, 5]

হয়ে:

0 + 1 + 2 + 3 + 4 + 5
^ Note the initial accumulator being added onto the left (for a left fold).

15 এর সমান।

mapআপনি যখন একটি তালিকা একই দৈর্ঘ্যের অন্য তালিকায় পরিবর্তন করতে চান তখন একটি ব্যবহার করুন ।

foldসংখ্যার তালিকার যোগফলের মতো আপনি যখন কোনও তালিকাকে একক মানে পরিণত করতে চান তখন ব্যবহার করুন ।

@ জর্জি মতামতগুলিতে যেমন উল্লেখ করেছেন যে, "একক মান" কোনও সংখ্যার মতো সহজ কিছু হওয়ার দরকার নেই; এটি কোনও তালিকা বা একটি টুপল সহ কোনও একক বস্তু হতে পারে! আমার জন্য যেভাবে ভাঁজগুলি আমার কাছে ক্লিক ছিল তা হ'ল ভাঁজের ক্ষেত্রে মানচিত্রটি সংজ্ঞায়িত করা । কীভাবে সংগ্রহকারী একটি তালিকা রয়েছে তা দ্রষ্টব্য:

function map(f, list):
    fold(
        function(xs, x): # xs is the list that has been processed so far
            xs.add( f(x) ) # Add returns the list instead of mutating it
        , [] # Before any of the list has been processed, we have an empty list
        , list) 

সত্য, একবার আপনি প্রতিটি বুঝতে পারলে, আপনি বুঝতে পারবেন যে কোনও লুপিং ভাঁজ বা মানচিত্র দ্বারা প্রতিস্থাপন করা যেতে পারে।


1
@ ইউসেনা @ ইউসেনা আপনার কোডের সাথে বেশ কয়েকটি ত্রুটি রয়েছে (যেমন iকখনই সংজ্ঞায়িত হয় না) তবে আমি মনে করি আপনার সঠিক ধারণা আছে। আপনার উদাহরণের সাথে একটি সমস্যা হ'ল: ফাংশন ( x), সম্পূর্ণ তালিকাস্ত্রের পরিবর্তে তালিকার একমাত্র উপাদানকেই পাস করে। প্রথমবার xবলা হয়, এটি আপনার প্রথম সঞ্চালক ( y) এটি প্রথম যুক্তি হিসাবে এবং দ্বিতীয় যুক্তি হিসাবে প্রথম উপাদানটি পাস করেছে । পরের বার এটি চালানোর পরে, xবাম দিকে (যা xপ্রথমবার ফিরে আসবে) নতুন সংগ্রহকারী এবং দ্বিতীয় তর্ক হিসাবে তালিকার দ্বিতীয় উপাদানটি পাস করা হবে ।
কারসিজেনিকেট

1
@ ইউসেনা এখন আপনার কাছে প্রাথমিক ধারণাটি রয়েছে, আবার জ্যাকের বাস্তবায়নটি দেখুন।
কারসিজেনিকেট

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

3
" foldআপনি যখন তালিকাটিকে একক মানে পরিণত করতে চান (যেমন সংখ্যার তালিকার যোগফলের মতো) চান তখন ব্যবহার করুন Use " - আমি কেবল লক্ষ করতে চাই যে এই "একক মান" ইচ্ছামত জটিল হতে পারে ... একটি তালিকা সহ! প্রকৃতপক্ষে, foldপুনরাবৃত্তির একটি সাধারণ পদ্ধতি এটি পুনরাবৃত্তি যা করতে পারে তা করতে পারে। উদাহরণস্বরূপ mapতুচ্ছভাবে প্রকাশ করা যেতে পারে func map(f, l) = fold((xs, x) => append(xs, f(x)), [], l)এখানে, গুণিত "একক মান" foldআসলে একটি তালিকা।
Jörg ডব্লু মিটাগ

2
... সম্ভবত একটি তালিকা দিয়ে করতে চান, এটি দিয়ে সম্পন্ন করা যেতে পারে fold। এবং এটি কোনও তালিকা হতে হবে না, প্রতিটি সংগ্রহ যা খালি / খালি নয় হিসাবে প্রকাশ করা যায় তা করবে। মূলত এর অর্থ হ'ল যে কোনও পুনরাবৃত্তি করবে। (আমি অনুমান করি যে সেখানে "catamorphism" শব্দটি প্রারম্ভিকের পরিচিতির জন্য খুব বেশি হবে, যদিও :
জার্গ ডব্লু মিট্টাগ

1

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

উদাহরণস্বরূপ হেসকেলে আপনার ইতিমধ্যে (^)প্রিলিডে ফাংশন রয়েছে।

বা আপনি যদি আরও প্রোগ্রাম্যাটিকালিকালটি করতে চান তবে product (replicate y x)

আমি যা বলছি তা হ'ল যদি আপনি এটি সরবরাহ করে এমন বৈশিষ্ট্যগুলি ব্যবহার না করেন তবে কোনও শৈলী / ভাষার শক্তি দেখানো শক্ত। তবে এটি কীভাবে পর্দার পিছনে কাজ করে তা দেখানোর দিকে ভাল পদক্ষেপ হতে পারে তবে আমি মনে করি আপনি যে কোনও ভাষা ব্যবহার করছেন সে ক্ষেত্রে আপনার সর্বোত্তম উপায়টি কোড করা উচিত এবং তারপরে সেখানকার ব্যক্তিকে যদি প্রয়োজন হয় তবে কী চলছে তা বুঝতে সাহায্য করুন।


1
অর্ডার কথাটি অন্যদের কাছে এই উত্তর লিঙ্ক করতে, এটি উল্লেখ করা উচিত যে productহয় মাত্র একটি শর্টকাট ফাংশন foldতার ফাংশন হিসাবে গুণ এবং 1 তার প্রারম্ভিক আর্গুমেন্ট হিসাবে সঙ্গে, এবং যে replicateএকটি ফাংশন যে কোনো ইটারেটরে (অথবা তালিকা উত্পাদন করে হয়; আমি লক্ষনীয় দুটির উপরে হ্যাসকেলে মূলত পৃথক পৃথক) যা প্রদত্ত সংখ্যক অভিন্ন আউটপুট দেয়। এই প্রয়োগটি কীভাবে উপরের @ জ্যাকের উত্তরের মতো একই কাজ করে তা বুঝতে এখনই সহজ হওয়া উচিত, কেবল আরও কার্যকর করার জন্য একই ফাংশনের পূর্বনির্ধারিত বিশেষ-বিশেষ সংস্করণ ব্যবহার করে।
পেরিটা ব্রেটা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.