পার্ল 6 ফাংশন হ্রাস এবং হ্রাস মেটাওপ্রেটর বিভিন্ন ফলাফল দেয়


12
my @s=<1 2 3 2 3 4>;
say reduce {$^a < $^b}, @s;
say [<] @s;
# --------
# True
# False

আমার প্রশ্নটি দ্বিগুণ: প্রথমত, হ্রাস মেটাওপ্রেটার কেন অপারেটরটিকে আলাদাভাবে প্রসেস করে <? দেখে মনে হচ্ছে হ্রাস মেটাওপ আনুমানিকভাবে একটি ভেরিয়েবল ব্যবহার করছে যা সত্য থেকে প্রথম মিথ্যাতে পরিবর্তিত হওয়ার পরে সেই পরিবর্তনটি ধরে রেখেছে কারণ:

say [\<] @s;
# ----------
# (True True True False False False)

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

উত্তর:


17

উভয় মেটা-অপারেটর এবং reduceঅপারেটরটির সাহিত্যিকতা তাদের কাছে দিয়েছিল; ক্ষেত্রে <, অপারেটর শৃঙ্খলিত হয়।

একটি কাস্টম ব্লক পাস করার পরে, এর reduceঅভ্যন্তর দেখতে পাবে না এবং তাই এটি বাম-সহযোগী ডিফল্টে ফিরে যায়; এরপরে এটি রিডুসার থেকে ফিরে আসা বুলিয়ানের সাথে পরবর্তী মানগুলির সাথে তুলনা করে, যা নির্ধারিত হয় 0বা 1যার কারণে ফলাফলটি শেষের মতো Trueশেষ হয়।

শাইনিং এসোসিয়েটিভিটি হিসাবে আপনার হ্রাস ফাংশনটি ঘোষণা করে আপনি যে শব্দার্থক শব্দগুলি চান তা পেতে পারেন:

my @s1 =<1 2 3 2 3 4>;
my @s2 =<1 2 3 4>;
sub my-reducer($a, $b) is assoc('chain') {
    $a < $b
}
say reduce &my-reducer, @s1;    # False
say reduce &my-reducer, @s2;    # True
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.