ল্যাম্বদা (ফাংশন) কী?


743

কোনও কমপ্লেষ্ক বিজ্ঞান ব্যাকগ্রাউন্ডবিহীন ব্যক্তির জন্য কম্পিউটার সায়েন্সের জগতে ল্যাম্বডা কী?


3
আমদা এক্সপ্রেশন সুন্দরভাবে এখানে ব্যাখ্যা ।
জামির মুলানী

1
দেখতে এই কিভাবে ল্যামডা ফাংশন বিভিন্ন ভাষায় অল্পক্ষণের জন্য, এবং কি বছরের তারা ভাষায় চালু হয়েছে হবে।
ফিলিপ শোয়ার্জ

উত্তর:


1081

লাম্বদা লাম্বদা ক্যালকুলাস থেকে আসে এবং প্রোগ্রামিংয়ে বেনামে ফাংশন বোঝায়।

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

পাইথন

def adder(x):
    return lambda y: x + y
add5 = adder(5)
add5(1)
6

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

অন্যান্য ভাষায় উদাহরণ

পার্ল 5

sub adder {
    my ($x) = @_;
    return sub {
        my ($y) = @_;
        $x + $y
    }
}

my $add5 = adder(5);
print &$add5(1) == 6 ? "ok\n" : "not ok\n";

জাভাস্ক্রিপ্ট

var adder = function (x) {
    return function (y) {
        return x + y;
    };
};
add5 = adder(5);
add5(1) == 6

জাভাস্ক্রিপ্ট (ES6)

const adder = x => y => x + y;
add5 = adder(5);
add5(1) == 6

পরিকল্পনা

(define adder
    (lambda (x)
        (lambda (y)
           (+ x y))))
(define add5
    (adder 5))
(add5 1)
6

সি # 3.5 বা ততোধিক

Func<int, Func<int, int>> adder = 
    (int x) => (int y) => x + y; // `int` declarations optional
Func<int, int> add5 = adder(5);
var add6 = adder(6); // Using implicit typing
Debug.Assert(add5(1) == 6);
Debug.Assert(add6(-1) == 5);

// Closure example
int yEnclosed = 1;
Func<int, int> addWithClosure = 
    (x) => x + yEnclosed;
Debug.Assert(addWithClosure(2) == 3);

দ্রুতগতি

func adder(x: Int) -> (Int) -> Int{
   return { y in x + y }
}
let add5 = adder(5)
add5(1)
6

পিএইচপি

$a = 1;
$b = 2;

$lambda = fn () => $a + $b;

echo $lambda();

Haskell,

(\x y -> x + y) 

জাভা দেখতে এই পোস্টে

// The following is an example of Predicate : 
// a functional interface that takes an argument 
// and returns a boolean primitive type.

Predicate<Integer> pred = x -> x % 2 == 0; // Tests if the parameter is even.
boolean result = pred.test(4); // true

অ্যাপ্লিকেশন Lua

adder = function(x)
    return function(y)
        return x + y
    end
end
add5 = adder(5)
add5(1) == 6        -- true

Kotlin

val pred = { x: Int -> x % 2 == 0 }
val result = pred(4) // true

চুনি

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

def adder(x)
  lambda { |y| x + y }
end
add5 = adder(5)
add5[1] == 6

রুবি হলেন রুবি, ল্যাম্বডাসের জন্য একটি শর্টহ্যান্ড রয়েছে, সুতরাং আপনি এইভাবে সংজ্ঞা দিতে পারেন adder:

def adder(x)
  -> y { x + y }
end

আর

adder <- function(x) {
  function(y) x + y
}
add5 <- adder(5)
add5(1)
#> [1] 6

3
তাহলে লাম্বদা ফাংশন এবং ফান্টিকার মধ্যে পার্থক্য কী ?
ম্যাক্সপাম

1
@ ম্যাক্সপাম একটি ফান্টাকর উদাহরণ ক্ষেত্র এবং ফাংশন সহ একটি স্ট্যান্ডার্ড অবজেক্ট হতে পারে, যেখানে ল্যাম্বডা ফাংশনটি সাধারণত কেবলমাত্র এক লাইনের নির্দেশনা নিয়ে থাকে। এটি অবশ্যই ভাষার ভাষার উপর নির্ভর করে পরিবর্তিত হতে পারে।
zdimension

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

1
@ কাইলডেলানী সত্যই, বেনামে ল্যাম্বডা হওয়ার প্রয়োজনীয় অবস্থা নয়, প্রকৃতপক্ষে এমন ল্যাম্বডা ফাংশন রয়েছে যা অজ্ঞাতনামা নয়, যেমন আপনি উদাহরণটিতে
একটিও উল্লেখ করেছেন

@ অলিআঙ্করালী বা রুবি ল্যাম্বডা ব্যবহার করতে অভ্যস্ত হন;)
জিমি এমজি লিম

107

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

উদাহরণস্বরূপ, এখানে কোডের একটি সি # টুকরা যা ল্যাম্বডা ব্যবহার করে না:

public Int32 Add(Int32 a, Int32 b)
{
    return a + b;
}

public Int32 Sub(Int32 a, Int32 b)
{
    return a - b;
}

public delegate Int32 Op(Int32 a, Int32 b);

public void Calculator(Int32 a, Int32 b, Op op)
{
    Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}

public void Test()
{
    Calculator(10, 23, Add);
    Calculator(10, 23, Sub);
}

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

সি # ২.০ এ আমরা বেনামে পদ্ধতি পেয়েছি, যা উপরের কোডটি এতে সংক্ষিপ্ত করে:

public delegate Int32 Op(Int32 a, Int32 b);

public void Calculator(Int32 a, Int32 b, Op op)
{
    Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}

public void Test()
{
    Calculator(10, 23, delegate(Int32 a, Int32 b)
    {
        return a + b;
    });
    Calculator(10, 23, delegate(Int32 a, Int32 b)
    {
        return a - b;
    });
}

এবং তারপরে সি # 3.0 এ আমরা ল্যাম্বডাস পেয়েছি যা কোডটিকে আরও ছোট করে তোলে:

public delegate Int32 Op(Int32 a, Int32 b);

public void Calculator(Int32 a, Int32 b, Op op)
{
    Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}

public void Test()
{
    Calculator(10, 23, (a, b) => a + b);
    Calculator(10, 23, (a, b) => a - b);
}

OpFunc<int, int>
ডেলিগেটকে

আমি Console.WriteLine("Calculator: op " + op.Method.Name + " (" + a + ", " + b + ") = " + op(a, b));প্রথম উদাহরণের জন্য পরামর্শ দেব ।
২৩7777

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

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

71

"ল্যাম্বদা" নামটি কেবল একটি .তিহাসিক নিদর্শন। আমরা যে সমস্ত কথা বলছি তা হ'ল একটি অভিব্যক্তি যার মূল্য একটি ফাংশন।

একটি সহজ উদাহরণ (পরের লাইনের জন্য স্কালা ব্যবহার করে):

args.foreach(arg => println(arg))

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

void printThat(Object that) {
  println(that)
}
...
args.foreach(printThat)

তা ছাড়া আপনার বিরক্ত করার দরকার নেই:

  1. অন্য কোথাও ফাংশনটি ঘোষণা করা (এবং পরে কোডটি পুনরায় দেখার সময় এটি সন্ধান করতে হবে)।
  2. এমন কিছু নামকরণ যা আপনি কেবল একবার ব্যবহার করছেন।

একবার আপনি মানগুলি ফাংশন করতে ব্যবহৃত হয়ে গেলে সেগুলি না করে নিখরচায় মনে হয় প্রতিটি অভিব্যক্তির নামকরণ করা দরকার যেমন:

int tempVar = 2 * a + b
...
println(tempVar)

আপনার যেখানে প্রয়োজন সেখানে কেবল প্রকাশটি লেখার পরিবর্তে:

println(2 * a + b)

সঠিক স্বরলিপি ভাষা থেকে ভাষাতে ভিন্ন হয়; গ্রীক সবসময় প্রয়োজন হয় না! ;-)


62

এটি ল্যাম্বডা ক্যালকুলাসকে বোঝায় , এটি একটি আনুষ্ঠানিক ব্যবস্থা যা সবেমাত্র ল্যাম্বডা এক্সপ্রেশন থাকে যা একটি ফাংশনকে প্রতিনিধিত্ব করে যা তার একক যুক্তির জন্য একটি ফাংশন গ্রহণ করে এবং একটি ফাংশন প্রদান করে। ল্যাম্বডা ক্যালকুলাসের সমস্ত ফাংশন সেই ধরণের, অর্থাত্‍ λ : λ → λ,।

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

(lambda (x y) (* x y)) 

এটি লাইনের মতো এটি প্রয়োগ করা যেতে পারে ( 50 টিতে মূল্যায়ন করে ):

((lambda (x y) (* x y)) 5 10)

আমি মনে করি আপনার ব্যবহার λ : λ -> λবিভ্রান্তিকর (এবং অবৈধ প্রকৃতপক্ষে)।
einpoklum

51

ল্যাম্বদা ক্যালকুলাস প্রতিস্থাপনের একটি সামঞ্জস্যপূর্ণ গাণিতিক তত্ত্ব। স্কুল গণিতে একজন উদাহরণস্বরূপ x+y=5জুড়ি দেওয়া দেখায় x−y=1। স্বতন্ত্র সমীকরণগুলি কৌশলগতভাবে চালিত করার উপায়গুলির সাথে এই দুটি থেকে তথ্য একসাথে রাখাও সম্ভব, প্রদত্ত ক্রস-সমীকরণের বিকল্পগুলি যৌক্তিকভাবে করা হয়। ল্যাম্বদা ক্যালকুলাস এই বিকল্পগুলি করার সঠিক পদ্ধতিটিকে কোড করে।

y = x−1দ্বিতীয় সমীকরণের একটি বৈধ পুনঃব্যবস্থা এটি দেওয়া , এটি: প্রতীকটির জন্য λ y = x−1চিহ্নগুলি প্রতিস্থাপন করা একটি ফাংশন । এখন প্রথম সমীকরণে প্রতিটি পদ প্রয়োগ করার কথা ভাবুন । যদি একটি পদ থাকে তবে প্রতিস্থাপন সম্পাদন করুন; অন্যথায় কিছুই করবেন না। আপনি যদি কাগজে এটি করেন তবে আপনি কীভাবে এটি প্রয়োগ করছেন তা দেখতে পাবেনx−1yλ yyλ y করলে প্রথম সমীকরণটি সমাধানযোগ্য হয়।

এটি কোনও কম্পিউটার বিজ্ঞান বা প্রোগ্রামিং ছাড়াই একটি উত্তর।

আমি যে সহজ প্রোগ্রামিংয়ের উদাহরণটি ভাবতে পারি তা হ'ল http://en.wikedia.org/wiki/Joy_( প্রোগ্রামিং_এলংয়েজি) : # কী_উত_কর্মগুলি :

এখানে বাধ্যতামূলক প্রোগ্রামিং ভাষা (সি) এ বর্গ ফাংশনটি কীভাবে সংজ্ঞায়িত করা যেতে পারে:

int square(int x)
{
    return x * x;
}

ভেরিয়েবল এক্স হল একটি আনুষ্ঠানিক প্যারামিটার যা ফাংশনটি বলা হলে স্কোয়ার করার জন্য প্রকৃত মান দ্বারা প্রতিস্থাপিত হয়। একটি কার্যকরী ভাষাতে (স্কিম) একই ফাংশন সংজ্ঞায়িত করা হবে:

(define square
  (lambda (x) 
    (* x x)))

এটি বিভিন্ন উপায়ে পৃথক, তবে এটি এখনও একই পদ্ধতিতে ফর্মাল প্যারামিটার এক্স ব্যবহার করে।


যুক্ত: http://imgur.com/a/XBHub

ল্যামডা


14

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

সি # ল্যাম্বদা সিনট্যাক্সে প্রায়শই অনামী বেনামের প্রতিনিধিদের মতো একই পদ্ধতিতে সহজ পদ্ধতিতে সংকলন করা হয় তবে এটিও ভেঙে যেতে পারে এবং এর যুক্তিটি পড়া যায়।

উদাহরণস্বরূপ (সি # 3 এ):

LinqToSqlContext.Where( 
    row => row.FieldName > 15 );

লিনকটোসকিউএল সেই ফাংশনটি (x> 15) পড়তে পারে এবং এক্সপ্রেশন ট্রি ব্যবহার করে নির্বাহ করতে প্রকৃত এসকিউএল এ রূপান্তর করতে পারে।

উপরের বিবৃতিটি হয়ে যায়:

select ... from [tablename] 
where [FieldName] > 15      --this line was 'read' from the lambda function

এটি সাধারণ পদ্ধতি বা বেনামে প্রতিনিধিদের চেয়ে পৃথক (যা সত্যিকারের কেবল যাদু সংকলক) যা তারা পড়তে পারে না ।

সি # তে সমস্ত পদ্ধতি যা ল্যাম্বদা সিনট্যাক্স ব্যবহার করে তা এক্সপ্রেশন ট্রিগুলিতে সংকলন করা যায় না (যেমন আসল ল্যাম্বদা ফাংশন)। এই ক্ষেত্রে:

LinqToSqlContext.Where( 
    row => SomeComplexCheck( row.FieldName ) );

এখন এক্সপ্রেশন ট্রিটি পড়া যায় না - সামারকম্পলেক্সচেক ভাঙ্গা যায় না। এসকিউএল স্টেটমেন্টটি যেখানেই ছাড়াই কার্যকর করা হবে এবং ডেটাগুলির প্রতিটি সারি পাঠানো হবে SomeComplexCheck

লাম্বদা ফাংশনগুলি বেনামে পদ্ধতিতে বিভ্রান্ত করা উচিত নয়। এই ক্ষেত্রে:

LinqToSqlContext.Where( 
    delegate ( DataRow row ) { 
        return row.FieldName > 15; 
    } );

এটিতে একটি 'ইনলাইন' ফাংশন রয়েছে, তবে এবার এটি কেবল যান্ত্রিক সংকলক - সি # সংকলকটি একটি স্বয়ংক্রিয়ভাবে নাম সহ একটি নতুন উদাহরণ পদ্ধতিতে এটি বিভক্ত করবে।

বেনামি পদ্ধতিগুলি পড়া যায় না, এবং ল্যাম্বদা ফাংশনগুলির জন্য যুক্তিটি অনুবাদ করা যায় না।


7

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

তাদের দ্রুত ব্যাখ্যা: ল্যাম্বডাস কোড (ফাংশন) কে ডেটা হিসাবে গণ্য করার একটি উপায়।


7

রুবির একটি ল্যাম্বদার উদাহরণ নিম্নরূপ:

hello = lambda do
    puts('Hello')
    puts('I am inside a proc')
end

hello.call

নিম্নলিখিত আউটপুট উত্পন্ন করবে:

Hello
I am inside a proc

5

@ ব্রায়ান আমি লিংক এবং নন-লিনকিউ অপারেটরগুলিতে সি # তে সর্বদা ল্যাম্বডাস ব্যবহার করি। উদাহরণ:

string[] GetCustomerNames(IEnumerable<Customer> customers)
 { return customers.Select(c=>c.Name);
 }

সি # এর আগে, আমি অ্যাজ্যাক্স ফাংশনে কলব্যাকের জন্য জাভাস্ক্রিপ্টে বেনাম ফাংশন ব্যবহার করেছি, আজাক্স শব্দটি এমনকি তৈরি হওয়ার আগে:

getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});

সি # এর ল্যাম্বডা সিনট্যাক্সের সাথে আকর্ষণীয় বিষয়টি হ'ল এটি হ'ল যে তাদের নিজস্ব ধরণের প্রকারভেদ করা যায় না (যেমন, আপনি var foo = (x, y) => x * y) টাইপ করতে পারবেন না তবে তারা কোন ধরণের উপর নির্ভর করে নির্ধারিত, সেগুলি প্রতিনিধি হিসাবে সংকলন করা হবে বা ভাবের প্রতিনিধিত্ব করে এমন বিমূর্ত সিনট্যাক্স ট্রি (এটি কীভাবে লিনকিউ অবজেক্ট ম্যাপাররা তাদের "ভাষা-সংহত" যাদু করে)।

এলআইএসপিতে লাম্বডাসকে একটি উদ্ধৃতি অপারেটরের কাছেও দেওয়া যেতে পারে এবং তারপরে তালিকার তালিকা হিসাবে ট্র্যাভার করা যায়। কিছু শক্তিশালী ম্যাক্রো এইভাবে তৈরি করা হয়।


5

প্রশ্নের আনুষ্ঠানিকভাবে বড় উত্তর দেওয়া হয়েছে, তাই আমি এই বিষয়ে আরও যুক্ত করার চেষ্টা করব না।

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

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



4

আমি এখানে একটি সি ++ 11 উদাহরণ দেখতে পাচ্ছি না বলেই আমি এগিয়ে যাব এবং এখান থেকে এই সুন্দর উদাহরণটি পোস্ট করব । অনুসন্ধানের পরে, এটি স্পষ্ট ভাষায় নির্দিষ্ট উদাহরণ যা আমি খুঁজে পেতে পারি find

হ্যালো, লাম্বডাস, সংস্করণ 1

template<typename F>

void Eval( const F& f ) {
        f();
}
void foo() {
        Eval( []{ printf("Hello, Lambdas\n"); } );
}

হ্যালো, লাম্বডাস, সংস্করণ 2:

void bar() {
    auto f = []{ printf("Hello, Lambdas\n"); };
    f();
}

3

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

? Calculator(10, 23, "a + b")
? Calculator(10, 23, "a - b");

FUNCTION Calculator(a, b, op)
RETURN Evaluate(op)

আনুষ্ঠানিক ল্যাম্বডাস ব্যবহারের একটি সুনির্দিষ্ট সুবিধা হ'ল (আমার ধারনা) কম্পাইল-টাইম চেকিং: ফক্স এটি জানতে পারবে না যে আপনি উপরের পাঠ্য স্ট্রিংটি চালানোর চেষ্টা না করা পর্যন্ত এটি টাইপ করেছেন কিনা।

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


3

কোনও কমপ্লেষ্ক বিজ্ঞান ব্যাকগ্রাউন্ডবিহীন ব্যক্তির জন্য কম্পিউটার সায়েন্সের জগতে ল্যাম্বডা কী?

আমি সহজ এবং পঠনযোগ্য অজগর কোডগুলির ধাপে ধাপে স্বজ্ঞাতভাবে এটি চিত্রিত করব।

সংক্ষেপে, একটি ল্যাম্বদা কেবল একটি বেনামে এবং ইনলাইন ফাংশন।

আসুন lambdasবেসিক পাটিগণিতের পটভূমি সহ একটি নতুন ব্যক্তি হিসাবে বুঝতে অ্যাসাইনমেন্ট থেকে শুরু করা যাক ।

অ্যাসাইনমেন্টের ব্লুপ্রিন্টটি হল 'নাম = মান', দেখুন:

In [1]: x = 1
   ...: y = 'value'
In [2]: x
Out[2]: 1
In [3]: y
Out[3]: 'value'

'x', 'y' নাম এবং 1, 'মান' মান। গণিতে কোনও ফাংশন চেষ্টা করুন

In [4]: m = n**2 + 2*n + 1
NameError: name 'n' is not defined

ত্রুটি রিপোর্ট,
আপনি কোড হিসাবে সরাসরি গণিত লিখতে পারবেন না, 'n' সংজ্ঞায়িত করা উচিত বা একটি মান নির্ধারিত করা উচিত।

In [8]: n = 3.14
In [9]: m = n**2 + 2*n + 1
In [10]: m
Out[10]: 17.1396

এটি এখন কাজ করে, আপনি যদি দুটি পৃথক রেখাকে একের সাথে সংযুক্ত করার জন্য জেদ করেন তবে কি হবে। আসেlambda

In [13]: j = lambda i: i**2 + 2*i + 1
In [14]: j
Out[14]: <function __main__.<lambda>>

কোনও ত্রুটি রিপোর্ট করা হয়নি।

এটি এক নজরে lambda, এটি আপনাকে কম্পিউটারে সরাসরি গাণিতিকের মতো একটি লাইনে একটি ফাংশন লিখতে সক্ষম করে।

আমরা পরে এটি দেখতে হবে।

আসুন 'অ্যাসাইনমেন্ট' এর উপর আরও গভীর খনন করা চালিয়ে যাওয়া যাক।

উপরে চিত্রিত হিসাবে, সমান প্রতীকটি =সাধারণ ডেটা (1 এবং 'মান') প্রকার এবং সরল অভিব্যক্তি (এন ** 2 + 2 * এন + 1) এর জন্য কাজ করে।

এটা চেষ্টা কর:

In [15]: x = print('This is a x')
This is a x
In [16]: x
In [17]: x = input('Enter a x: ')
Enter a x: x

এটি সাধারণ বিবৃতিগুলির জন্য কাজ করে, পাইথন in এগুলির মধ্যে ১১ প্রকার রয়েছে Simple সরল বিবৃতি - পাইথন ৩.6.৩ ডকুমেন্টেশন

যৌগিক বিবৃতি সম্পর্কে,

In [18]: m = n**2 + 2*n + 1 if n > 0
SyntaxError: invalid syntax
#or
In [19]: m = n**2 + 2*n + 1, if n > 0
SyntaxError: invalid syntax

সেখানে আসে defকাজ এটি সক্রিয়

In [23]: def m(n):
    ...:     if n > 0:
    ...:         return n**2 + 2*n + 1
    ...:
In [24]: m(2)
Out[24]: 9

তদা, এটি বিশ্লেষণ করুন, 'মি' নাম, 'এন ** 2 + 2 * এন + 1' এর মান। :'=' এর একটি রূপ।
এটি সন্ধান করুন, যদি কেবল বোঝার জন্য, সবকিছু অ্যাসাইনমেন্ট থেকে শুরু হয় এবং সবকিছুই অ্যাসাইনমেন্ট।

এখন ফিরে আসি lambda, আমাদের 'm' নামে একটি ফাংশন আছে

চেষ্টা করুন:

In [28]: m = m(3)
In [29]: m
Out[29]: 16

এখানে 'মি' এর দুটি নাম রয়েছে, ফাংশনটির mইতিমধ্যে একটি নাম রয়েছে, সদৃশ।

এটি এর মতো বিন্যাসকরণ:

In [27]: m = def m(n):
    ...:         if n > 0:
    ...:             return n**2 + 2*n + 1
    SyntaxError: invalid syntax

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

আমাদের মধ্যে একটি মুছতে হবে, নাম ছাড়াই একটি ফাংশন সেট করতে হবে।

m = lambda n:n**2 + 2*n + 1

একে 'বেনামে ফাংশন' বলা হয়

উপসংহারে,

  1. lambda একটি ইনলাইন ফাংশনে যা আপনাকে গণিতের মতো একটি সরাসরি লাইনে একটি ফাংশন লিখতে সক্ষম করে
  2. lambda বেনামে

আশাকরি এটা সাহায্য করবে.


2

এটি এমন একটি ফাংশন যার কোনও নাম নেই। যেমন সি # তে আপনি ব্যবহার করতে পারেন

numberCollection.GetMatchingItems<int>(number => number > 5);

5 এর চেয়ে বেশি নম্বরগুলি ফিরিয়ে দিতে।

number => number > 5

এখানে ল্যাম্বদা অংশ। এটি এমন একটি ফাংশন উপস্থাপন করে যা একটি প্যারামিটার (সংখ্যা) নেয় এবং একটি বুলিয়ান মান (সংখ্যা> 5) প্রদান করে। GetMatchingItems পদ্ধতিটি সংগ্রহের সমস্ত আইটেমগুলিতে এই ল্যাম্বদা ব্যবহার করে এবং ম্যাচিংয়ের আইটেমগুলি ফেরত দেয়।


2

জাভাস্ক্রিপ্ট মধ্যে, উদাহরণস্বরূপ, ফাংশন অন্য সব কিছুর মতো একই মিশ্র ধরনের হিসাবে গণ্য করা হয় ( int, string, float, bool)। এর মতো, আপনি ফ্লাইতে ফাংশন তৈরি করতে পারেন, জিনিসগুলিতে তাদের বরাদ্দ করতে পারেন এবং পরে তাদের আবার কল করতে পারেন। এটি দরকারী তবে আপনি ব্যবহারের অতিরিক্ত কিছু চান না বা আপনি আপনার কোডটি বজায় রাখার জন্য প্রত্যেককে বিভ্রান্ত করবেন ...

এই খরগোশের গর্তটি কত গভীর হয় তা দেখতে আমি এটি খেলছিলাম:

var x = new Object;
x.thingy = new Array();
x.thingy[0] = function(){ return function(){ return function(){ alert('index 0 pressed'); }; }; }
x.thingy[1] = function(){ return function(){ return function(){ alert('index 1 pressed'); }; }; }
x.thingy[2] = function(){ return function(){ return function(){ alert('index 2 pressed'); }; }; }

for(var i=0 ;i<3; i++)
    x.thingy[i]()()();

2

সিএসের প্রসঙ্গে ল্যাম্বডা ফাংশন হ'ল একটি বিমূর্ত গাণিতিক ধারণা যা গাণিতিক প্রকাশগুলির প্রতীকী মূল্যায়নের সমস্যার সমাধান করে। সেই প্রসঙ্গে ল্যাম্বডা ফাংশন ল্যাম্বডা টার্মের সমান ।

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


2

Lambda Function, বা ক Small Anonymous Function, কার্যকারিতার একটি স্ব-অন্তর্ভুক্ত ব্লক যা আপনার কোডে চারপাশে পাস এবং ব্যবহার করা যেতে পারে। - ল্যামডা বিভিন্ন বিভিন্ন প্রোগ্রামিং ভাষার নাম হয়েছে Lambdaপাইথন এবং Kotlin , Closureমধ্যে সুইফট , অথবা Blockমধ্যে সি এবং উদ্দেশ্য সি । যদিও ল্যাম্বদার অর্থ এই ভাষাগুলির জন্য বেশ অনুরূপ তবে এর মাঝে মাঝে কিছুটা আলাদা পার্থক্য রয়েছে।

চলুন দেখা যাক লাম্বদা (সমাপ্তি) কীভাবে বাছাই করা () পদ্ধতির সাথে সুইফট ৪.২-তে কাজ করে - স্বাভাবিক ফাংশন থেকে স্বল্পতম অভিব্যক্তি পর্যন্ত:

let coffee: [String] = ["Cappuccino", "Espresso", "Latte", "Ristretto"]

1. সাধারণ ফাংশন

func backward(_ n1: String, _ n2: String) -> Bool {
    return n1 > n2
}
var reverseOrder = coffee.sorted(by: backward)


// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]

2. বন্ধের এক্সপ্রেশন

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in
    return n1 > n2
})

3. ইনলাইন সমাপ্তি এক্সপ্রেশন

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in return n1 > n2 } )

৪. প্রসঙ্গ থেকে প্রকারভেদ করুন

reverseOrder = coffee.sorted(by: { n1, n2 in return n1 > n2 } )

5. একক-প্রকাশের সমাপ্তি থেকে অন্তর্ভুক্ত রিটার্নস

reverseOrder = coffee.sorted(by: { n1, n2 in n1 > n2 } )

Short. শর্টহ্যান্ড আর্গুমেন্টের নাম

reverseOrder = coffee.sorted(by: { $0 > $1 } )

// $0 and $1 are closure’s first and second String arguments.

7. অপারেটর পদ্ধতি

reverseOrder = coffee.sorted(by: >)

// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]

আশাকরি এটা সাহায্য করবে.


1

আমি এটা পেয়েছিলাম। আমি এর সাথে এটি জেএসে চেষ্টা করেছি:

var addAndMult = function(x) {
        return (function(y) {
            return (function(z) {
                return (x+y)*z; 
                });
            });
        };

এটি 2 থেকে 4 যোগ করে তারপরে ফলাফলটি 6 দ্বারা বিভক্ত করে দেয় তবে আমি মাঝে মাঝে পড়তে অসুবিধা বোধ করি :(

এছাড়াও প্রতিটি অনুষ্ঠানের জন্য আমি আকর্ষণীয় করে তুলেছি:

var forEach = function(arr) {
            return (function(x) {
            for (var i=0; arr[i]; i++) {
                 x(arr[i]);
             }
        });
    }

foreach ([1,2,3,4,5]) (console.log);

এই পদ্ধতিটি একটি অ্যারের পুনরাবৃত্তি করবে এবং একটি ক্রিয়া সম্পাদন করবে - কনসোলে মুদ্রণের ক্ষেত্রে। এখন আমিও কেন ল্যাবমডাস শক্তিশালী।


1

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

অভিব্যক্তি, বিবৃতি এবং ফাংশনগুলির মধ্যে আমাদের স্পষ্ট বিচ্ছেদ রয়েছে, যা গণিতবিদদের নেই।

প্রোগ্রামিংয়ে "ফাংশন" শব্দটিও পৃথক - আমাদের কাছে "ফাংশনটি করণীয় এক ধরণের পদক্ষেপ" (ল্যাটিন থেকে "পারফর্ম")। গণিতে এটি ভেরিয়েবলের মধ্যে পারস্পরিক সম্পর্ক সম্পর্কিত কিছু।

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


0

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

ল্যাম্বদা (বেনামে ফাংশন) এর উদাহরণ রয়েছে

let f = |x: f32| -> f32 { x * x - 2.0 };
let df = |x: f32| -> f32 { 2.0 * x };

আমি যখন নিউটন – র‌্যাফসন পদ্ধতির একটি মডিউল লিখছিলাম, তখন এটি প্রথম এবং দ্বিতীয় ক্রমের ডেরাইভেটিভ হিসাবে ব্যবহৃত হত। (আপনি যদি নিউটন – র‌্যাফসন পদ্ধতিটি জানতে চান তবে অনুগ্রহ করে " https://en.wikedia.org/wiki/Newton%27s_method " দেখুন।

নিম্নলিখিত হিসাবে আউটপুট

println!("f={:.6}      df={:.6}", f(10.0), df(10.0))

f=98.000000       df=20.000000

0

কল্পনা করুন যে আপনার কাছে একটি বিতরণ বিকল্প সহ একটি রেস্তোঁরা রয়েছে এবং আপনার কাছে একটি অর্ডার রয়েছে যা 30 মিনিটের মধ্যেই করা উচিত। মুল বক্তব্যটি হ'ল গ্রাহকরা সাধারণত খেয়াল রাখেন না যতক্ষণ আপনি খাবারটি উষ্ণ রাখেন এবং বেঁধে রাখেন ততক্ষণ আপনি গাড়ি বা খালি পা দিয়ে বাইক চালিয়ে তাদের খাবার পাঠান। সুতরাং বেনামে এবং সংজ্ঞায়িত পরিবহন ফাংশনগুলির সাথে এই আইডিয়মটিকে জাভাস্ক্রিপ্টে রূপান্তর করতে দিন।

নীচে আমরা আমাদের বিতরণ ওরকের উপায়টি সংজ্ঞায়িত করেছি আমরা একটি ফাংশনে একটি নাম সংজ্ঞায়িত করেছি:

// ES5 
var food = function withBike(kebap, coke) {
return (kebap + coke); 
};

যদি আমরা এই স্থানান্তরটি সম্পাদন করতে তীর / ল্যাম্বদা ফাংশন ব্যবহার করব:

// ES6    
const food = (kebap, coke) => { return kebap + coke };

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

বিটিডব্লিউ, আমি কোকের সাথে কাবাবের প্রস্তাব দিচ্ছি না, এ কারণেই উপরের কোডগুলি আপনাকে ত্রুটি দেয়। আনন্দ কর.

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