"পয়েন্ট ফ্রি" স্টাইলটি কী (কার্যকরী প্রোগ্রামিংয়ে)?


106

একটি বাক্যাংশ যা আমি সম্প্রতি লক্ষ্য করেছি এটি হ'ল "বিন্দু মুক্ত" স্টাইলের ধারণা ...

প্রথমত, এই প্রশ্নটি ছিল এবং এটিও একটি

তারপরে, আমি এখানে আবিষ্কার করেছি তারা উল্লেখ করেছে "অন্য একটি বিষয় যা আলোচনার পক্ষে উপযুক্ত তা হ'ল পয়েন্ট মুক্ত শৈলীতে লেখকদের অপছন্দ।"

"বিন্দু মুক্ত" শৈলী কি? কেউ কি সংক্ষিপ্ত ব্যাখ্যা দিতে পারে? "স্বয়ংক্রিয়" কারিরিংয়ের সাথে কি কিছু করার আছে?

আমার স্তরের ধারণা পেতে - আমি নিজেকে স্কিম শিখিয়েছি, এবং একটি সাধারণ স্কিম ইন্টারপ্রিটার লিখেছি ... আমি "অন্তর্নিহিত" কারীকরণটি কী তা বুঝতে পেরেছি, তবে আমি কোনও হাস্কেল বা এমএল জানি না।


4
কেবল একটি নোট: এটি পয়েন্টফ্রি কেন বলা হয়েছে তা দেখার জন্য পয়েন্টফ্রি / পয়েন্টফ্রিতে আরও পয়েন্ট রয়েছে! হাস্কেলউইকিতে
পেটর

উত্তর:


66

আপনার সংজ্ঞা পেতে কেবল উইকিপিডিয়া নিবন্ধটি দেখুন :

ট্যাসিট প্রোগ্রামিং (পয়েন্ট-ফ্রি প্রোগ্রামিং) একটি প্রোগ্রামিং দৃষ্টান্ত যা কোনও ফাংশন সংজ্ঞায় ভেরিয়েবলের পরিবর্তে কম্বিনেটর এবং ফাংশন রচনা [...] ব্যবহার করে তার যুক্তি সম্পর্কিত তথ্য অন্তর্ভুক্ত করে না।

হাসেল উদাহরণ:

প্রচলিত (আপনি আর্গুমেন্টগুলি স্পষ্টভাবে উল্লেখ করেছেন):

sum (x:xs) = x + (sum xs)
sum [] = 0

বিন্দু মুক্ত ( sumকোনও স্পষ্ট যুক্তি নেই - এটি +0 দিয়ে শুরু করে কেবল একটি ভাঁজ ):

 sum = foldr (+) 0

বা এমনকি সহজ: পরিবর্তে g(x) = f(x), আপনি কেবল লিখতে পারেন g = f

সুতরাং হ্যাঁ: এটি তরঙ্গকরণের সাথে ঘনিষ্ঠভাবে সম্পর্কিত (বা ফাংশন রচনাগুলির মতো ক্রিয়াকলাপ)।


8
ওহহ আচ্ছা! সুতরাং আপনি আর্গুমেন্ট ঘোষণার পরিবর্তে অন্যান্য ফাংশনগুলিকে একত্রিত করে সর্বদা নতুন ফাংশন তৈরি করেন ... খুব মার্জিত!
পল হোলিংসওয়ার্থ

22
আমি যখন প্রোগ্রামিং করছি তখন ভেরিয়েবল / আর্গুমেন্টের জন্য নতুন নাম নিয়ে আসা সত্যিই আমার পছন্দ নয়। এটি একটি বড় কারণ আমি বিন্দু মুক্ত শৈলী পছন্দ করি!
মার্টিজন

4
এটি কারিংয়ের সাথে কীভাবে সম্পর্কিত?
ক্যালিডিক

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

4
আপনি এর sum (x:xs) ...পরিবর্তে মানে না sum sum (x:xs) ...?
এহতেশ চৌধুরী

34

বিন্দু মুক্ত শৈলীর অর্থ হ'ল ফাংশনটির আর্গুমেন্টগুলি সুস্পষ্টভাবে উল্লেখ করা হয়নি, যা ফাংশন সংমিশ্রনের মাধ্যমে ফাংশনটি সংজ্ঞায়িত করা হয়।

আপনার যদি দুটি ফাংশন থাকে তবে লাইক দিন

square :: a -> a
square x = x*x

inc :: a -> a
inc x = x+1

এবং যদি আপনি এই দুটি ফাংশনকে গণনা করে এমন একটির সাথে একত্রিত করতে চান তবে আপনি x*x+1এটি "পয়েন্ট-ফুল" এর মতো সংজ্ঞা দিতে পারেন:

f :: a -> a
f x = inc (square x)

বিন্দু মুক্ত বিকল্পটি যুক্তি সম্পর্কে কথা না বলাই হবে x:

f :: a -> a
f = inc . square

22
মূর্খতার সাথে, হাস্কেল-তে 'পয়েন্ট-ফ্রি' উপায়টি সাধারণত পয়েন্টার (আরও সময়সীমা) দেখায়। এই বিরক্তি একটি দুর্দান্ত স্মৃতিচারণ করে। (রিয়েল ওয়ার্ল্ড হাস্কেল বইটি এ সম্পর্কে মন্তব্য করেছে))
ডেন

4
@ ড্যানের মন্তব্য সম্পর্কিত, পয়েন্টফ্রি হাস্কেলউইকি পৃষ্ঠায় কেন এটি পয়েন্টফ্রি বলা হয় তার একটি ব্যাখ্যা সরবরাহ করে
ভিনসেন্ট সাভার্ড

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

14

একটি জাভাস্ক্রিপ্ট নমুনা:

//not pointfree cause we receive args
var initials = function(name) {
  return name.split(' ').map(compose(toUpperCase, head)).join('. ');
};

const compose = (...fns) => (...args) => fns.reduceRight((res, fn) => [fn.call(null, ...res)], args)[0];
const join = m => m.join();

//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));

initials("hunter stockton thompson");
// 'H. S. T'

রেফারেন্স


7

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

এটি হাস্কেলে কাজ করে কারণ কার্যকারিতা কাজ করে।

এই ক্ষেত্রে:

myTake = take

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


4
কখনও কখনও, এটি হাস্কেল 98 তে কাজ করে না myShow = showহাস্কেল উইকিতে
এহতেশ চৌধুরী

-1

অন্য কোনও লাইব্রেরি ছাড়াই এখানে টাইপস্ক্রিপ্টের একটি উদাহরণ রয়েছে:

interface Transaction {
  amount: number;
}

class Test {
  public getPositiveNumbers(transactions: Transaction[]) {
    return transactions.filter(this.isPositive);

    //return transactions.filter((transaction: {amount: number} => transaction.amount > 0));
  }

  public getBigNumbers(transactions: Transaction[]) {
    // point-free
    return transactions.filter(this.moreThan(10));

    // not point-free
    // return transactions.filter((transaction: any) => transaction.amount > 10);
  }

  private isPositive(transaction: Transaction) {
    return transactions.amount > 0;
  }

  private moreThan(amount: number) {
    return (transaction: Transaction) => {
      return transactions.amount > amount;
    }
  }
}

আপনি দেখতে পয়েন্ট-মুক্ত শৈলীটি আরও "সাবলীল" এবং পড়তে সহজ।


এটি বিন্দু মুক্ত শৈলী নয়, এটি কেবল একটি ল্যাম্বদা এবং একটি নামকৃত ফাংশনের মধ্যে পার্থক্য।
kralyk

@ ক্যার্লাইক আমার ধারণা আপনি বিন্দুটি মিস করেছেন, this.moreThan(10)এটি কোনও নামকৃত ফাংশন নয়, এটি একটি ত্রিযুক্ত ফাংশন এবং এমন একটি ফাংশন যা স্পষ্টতই (এইভাবে বিন্দু মুক্ত) transactionএর ইনপুট হিসাবে গ্রহণ করবে ।
এজেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.