কে কম্বিনেটর (সি #, স্কালা)
আমি রুবিতে কে কম্বিনেটরটি প্রায়শই ব্যবহার করি, বেশিরভাগ ভাঁজগুলিতে যখন ভাঁজ অপারেশনটি কোনও ফেরতের মানের পরিবর্তে পার্শ্ব প্রতিক্রিয়া দ্বারা সঞ্চালিত হয়, যেমন উদাহরণ হিসাবে:
some_collection.reduce(Hash.new(0)) {|acc, el| acc[el] += 1 }
এটি প্রতিটি উপাদান কতবার ঘটে তা গণনা করে some_collection
। দুর্ভাগ্যক্রমে, এটি আসলে কাজ করে না, যেহেতু ব্লকটি প্রতিটি পুনরাবৃত্তিতে সঞ্চয়ের নতুন মানটি ফিরিয়ে দিতে হয়, তবে রুবি অ্যাসাইনমেন্টে নির্ধারিত মানকে মূল্যায়ন করে।
সুতরাং, আপনাকে প্রত্যক্ষভাবে এর মতো সঞ্চয়ের নতুন মানটি ফিরিয়ে দিতে হবে:
some_collection.reduce(Hash.new(0)) {|acc, el| acc[el] += 1; acc }
তবে আমি ভাঁজগুলি ব্যবহার করে এই কার্যকরী-ইশ শৈলীতে এই জাতীয় স্পষ্ট ক্রমগুলি কুশ্রী খুঁজে পাই। কে সংযুক্তকারী ( Object#tap
রুবিতে ডাকা ) উদ্ধারের জন্য:
some_collection.reduce(Hash.new(0)) {|acc, el| acc.tap { acc[el] += 1 }}
আমি ইতিমধ্যে এটি সি # তে বেশ কয়েকবার মিস করেছি (বেশিরভাগ কারণেই কোনও কারণে সংগ্রহের বিভাজন যেমন: পরিবর্তে List.Add
ফিরে আসা ) এবং স্কালায়, তাই আমি এটিকে বহন করি:void
this
namespace GenericExtensions
{
public static class GenericExtensions
{
public static T Tap<T>(this T o, Action<T> f)
{
Contract.Requires(o != null);
Contract.Requires(f != null);
f(o);
return o;
}
public static T Tap<T>(this T o, Action f)
{
Contract.Requires(o != null);
Contract.Requires(f != null);
f();
return o;
}
}
}
এবং স্কালায়:
class Tap[T](o: T) {
def tap(f: T => Unit) = { f(o); o }
def tap(f: => Unit) = { f; o }
}
object Implicits { implicit def any2Tap[T](o: T) = new Tap(o) }
পরিচয় ফাংশন (রুবি)
আমি রুবিতে কিছু হারিয়ে যাচ্ছি, এটি পরিচয় ফাংশনটি অ্যাক্সেস করার একটি দুর্দান্ত নাম way হাস্কেল পরিচয় ফাংশন প্রদান করে id
, এর নামে স্কালার নামে identity
। এটির মতো কোড লেখার অনুমতি দেয়:
someCollection.groupBy(identity)
রুবির সমতুল্য
some_collection.group_by {|x| x }
জিহ্বা ঠিক রোল করে না, তাই না?
ঠিক আছে
IDENTITY = -> x { x }
some_collection.group_by(&IDENTITY)
ফরইচ (। নেট)
সি # তে আরও একটি খারাপভাবে অনুপস্থিত পদ্ধতি:
namespace IEnumerableExtensions
{
public static class IEnumerableExtensions
{
public static void ForEach<T>(this IEnumerable<T> xs, Action<T> f)
{
Contract.Requires(xs != null);
Contract.Requires(f != null);
foreach (var x in xs) f(x);
}
}
}