के कॉम्बिनेटर (C #, स्काला)
मैं रूबी में के कॉम्बिनेटर का उपयोग अक्सर करता हूं, ज्यादातर गुना में जब तह ऑपरेशन एक वापसी मूल्य के बजाय एक साइड इफेक्ट के माध्यम से किया जाता है, जैसे कि इस उदाहरण में:
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
बचाव के लिए K कॉम्बिनेटर ( रूबी में कहा जाता है):
some_collection.reduce(Hash.new(0)) {|acc, el| acc.tap { acc[el] += 1 }}
मैंने पहले ही इसे C # में कई बार याद किया है (ज्यादातर इसलिए कि किसी कारण से संग्रह म्यूटेटर जैसे कि 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) }
पहचान समारोह (रूबी)
मैं रूबी में कुछ याद कर रहा हूं, पहचान समारोह तक पहुंचने का एक अच्छा नाम है। हास्केल, के नाम पर id
, स्काला के नाम से पहचान समारोह प्रदान करता है identity
। यह एक को कोड लिखने की अनुमति देता है जैसे:
someCollection.groupBy(identity)
रूबी में बराबर है
some_collection.group_by {|x| x }
बिल्कुल जीभ से नहीं लुढ़कता है?
तय है
IDENTITY = -> x { x }
some_collection.group_by(&IDENTITY)
ForEach (.NET)
C # में एक और ग़ायब तरीक़ा:
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);
}
}
}