ফাংশনাল প্রোগ্রামিংয়ে "আংশিক ফাংশন" বলতে আসলে কী বোঝায়?


55

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

>>> def add(x,y):
...    return x+y
... 
>>> new_function = add(1)
>>> new_function(2)
3

উপরের স্নিপেটে new_functionএকটি আংশিক ফাংশন রয়েছে। তবে, হাস্কেল উইকির মতে , আংশিক ফাংশনটির সংজ্ঞা

একটি আংশিক ফাংশন একটি ফাংশন যা নির্দিষ্ট ধরণের সমস্ত সম্ভাব্য আর্গুমেন্টের জন্য সংজ্ঞায়িত হয় না।

সুতরাং, আমার প্রশ্ন: "আংশিক ফাংশন" বলতে আসলে কী বোঝায়?


37
আপনি একটি বিভ্রান্তিকর হয় আংশিকভাবে প্রয়োগ একটি সঙ্গে ফাংশন আংশিক ফাংশন।
উইলেম ভ্যান অনসেম

11
পাইথনের আংশিক অ্যাপ্লিকেশনpartial সঞ্চালিত হয় , যেখানে হাস্কেল সেটি স্বয়ংক্রিয়ভাবে করে। উইকি এন্ট্রি আংশিক ফাংশন বোঝায় , যা গণিত থেকে একটি শব্দ।
L3viathan

9
কড়া কথায় বলতে গেলে, হাস্কেল আংশিক ফাংশন অ্যাপ্লিকেশনটি করে না। প্রতিটি ফাংশন একটি যুক্তি নেয়, এবং ফাংশন অ্যাপ্লিকেশন একটি ফাংশন একক যুক্তিতে প্রয়োগ করে। কারি করা প্রথম স্থানটিতে একাধিক-আর্গুমেন্ট ফাংশনগুলি অনুকরণ করে আপনি অন্য ভাষায় আংশিক প্রয়োগ হিসাবে কী ভাবেন তা অনুকরণ করে । এর মতো কিছু add 3 5একক ফাংশন অ্যাপ্লিকেশন নয়। addনতুন ফাংশনটি পেতে এটি প্রথমে 3
টির

এবং C #, একটি partialপদ্ধতি একটি এর একটা ফরওয়ার্ড ঘোষণা হয় ঐচ্ছিকরূপে প্রকল্পের কোডবেস বাস্তবায়িত বেসরকারী পদ্ধতি অন্যত্র।
দাই

1
আপনার উদাহরণ বৈধ করা যেতে পারে:new_function = functools.partial(add, 1)
wjandrea

উত্তর:


76

আপনি এখানে দুটি ধারণাকে বিভ্রান্ত করছেন। একটি আংশিক প্রয়োগ ফাংশন [হাসেল-উইকি] একটি আংশিক ফাংশন [হাসেল-উইকি] সহ

আংশিক প্রয়োগিত ফাংশনটি হ'ল:

হাস্কেলের আংশিক অ্যাপ্লিকেশনটিতে একাধিক যুক্তি গ্রহণকারী ফাংশনে সম্পূর্ণ আর্গুমেন্টের চেয়ে কম পাস করা জড়িত ।

যদিও একটি আংশিক ফাংশন প্রকৃতপক্ষে একটি সর্বমোট ফাংশন:

একটি আংশিক ফাংশন একটি ফাংশন যা নির্দিষ্ট ধরণের সমস্ত সম্ভাব্য আর্গুমেন্টের জন্য সংজ্ঞায়িত হয় না।


24
এটি একটি ভাল উত্তর, তবে উত্তরের একটি আংশিক ফাংশনের উদাহরণ যোগ করে এটি উন্নত হতে পারে।
ApproachingDarknessFish

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

21

একটি আংশিক ফাংশন (ফাংশনাল প্রোগ্রামিং এবং গণিত উভয় প্রসঙ্গে) উইকি ঠিক তাই বলে: একটি ফাংশন তার সম্ভাব্য সমস্ত আর্গুমেন্টের জন্য সংজ্ঞায়িত হয় না। প্রোগ্রামিংয়ের প্রসঙ্গে আমরা সাধারণত অপরিজ্ঞাত আচরণ, ব্যতিক্রম বা অবসানহীনতা সহ বেশ কয়েকটি জিনিসের একটি হিসাবে "সংজ্ঞায়িত নয়" ব্যাখ্যা করি।

আংশিক ফাংশনের একটি উদাহরণ পূর্ণসংখ্যা বিভাগ হবে, যা সংজ্ঞা দেওয়া হয় না যদি বিভাজক 0 হয় (হাস্কেলে এটি একটি ত্রুটি ছুঁড়ে দেবে)।

উপরের স্নিপেটে new_function আংশিক ফাংশন।

এই কোডটি পাইথনে কেবল ত্রুটি ঘটায়, তবে এটি যদি আপনার ইচ্ছা অনুসারে কাজ করে তবে এটি মোট (আংশিক নয়) ফাংশন হবে।

মন্তব্যকারীরা যেমন ইতিমধ্যে চিহ্নিত করেছেন, আপনি সম্ভবত এটি সত্যভাবে ভাবছেন যে এটি একটি আংশিক প্রয়োগিত কার্য হবে।


18

উত্তরগুলি সমস্ত ব্যাখ্যা করে, আমি প্রতিটি ভাষায় কেবল একটি উদাহরণ যুক্ত করব:

def add(x,y):
    return x+y

f = add(1)
print(f(3))

    f = add(1)
TypeError: add() missing 1 required positional argument: 'y'

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

অজগরটিতে একটি ত্রিযুক্ত ফাংশনটি এরকম হওয়া উচিত:

partialAdd= lambda x: lambda y: x + y

plusOne = partialAdd(1)
print(plusOne(3))

4

এবং হ্যাসকেলে:

plus :: Int -> Int -> Int
plus x y = x + y

plusOne = plus 1

plusOne 4

5

পাইথনের একটি আংশিক কাজ:

def first(ls):
    return ls[0]

print(first([2,4,5]))
print(first([]))

আউটপুট

2

print(first([]))
  File "main.py", line 2, in first
    return ls[0]
IndexError: list index out of range

এবং হাস্কেলের মধ্যে, যেমনটি আপনার লিঙ্কটি প্রদর্শিত হয়েছিল:

head [1,2,3]
3

head []
*** Exception: Prelude.head: empty list

সুতরাং একটি মোট ফাংশন কি?

ভাল, মূলত বিপরীত: এটি এমন একটি ফাংশন যা এই ধরণের কোনও ইনপুটটির জন্য কাজ করবে। পাইথনের উদাহরণ এখানে:

def addElem(xs, x):
  xs.append(x)
  return xs

এবং এটি এমনকি যদি আপনি কিছু কৌশল ব্যবহার করেন তবে অসীম তালিকার জন্যও কাজ করে:

def infiniList():
    count = 0
    ls = []
    while True:
        yield ls
        count += 1
        ls.append(count)

ls = infiniList()
for i in range(5):
  rs = next(ls)

print(rs, addElem(rs,6))

[1, 2, 3, 4]
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]

এবং হাস্কেলের সমতুল্য:

addElem :: a -> [a] -> [a]
addElem x xs = x : xs

addElem 3 (take 10 [1..])
=> [3,1,2,3,4,5,6,7,8,9,10]

এখানে ফাংশন চিরকাল স্থায়ী হয় না। ধারণাটি একই রকম: প্রতিটি তালিকার জন্য ফাংশনটি কাজ করবে।


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