私は関数プログラミングについて少し勉強しています。私は疑問に思っています:このC#拡張メソッドは純粋ではありませんか?
1)私のForEach
拡張メソッドが純粋ならば?私がそれを呼び出す方法は、 "オブジェクトが渡されることで混乱しないでください"という違反のようです。
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
action(item);
}
static void Main(string[] args)
{
List<Cat> cats = new List<Cat>()
{
new Cat{ Purring=true,Name="Marcus",Age=10},
new Cat{ Purring=false, Name="Fuzzbucket",Age=25 },
new Cat{ Purring=false, Name="Beanhead",Age=9 },
new Cat{Purring=true,Name="Doofus",Age=3}
};
cats.Where(x=>x.Purring==true).ForEach(x =>
{
Console.WriteLine("{0} is a purring cat... purr!", x.Name);
});
// *************************************************
// Does this code make the extension method impure?
// *************************************************
cats.Where(x => x.Purring == false).ForEach(x =>
{
x.Purring = true; // purr,baby
});
// all the cats now purr
cats.Where(x=>x.Purring==true).ForEach(x =>
{
Console.WriteLine("{0} is a purring cat... purr!", x.Name);
});
}
public class Cat {
public bool Purring;
public string Name;
public int Age;
}
2)不都合な場合は、悪いコードですか?私は個人的には、古いforeach (var item in items) { blah; }
よりもきれいな見た目のコードを作っていると思うが、それは不純なかもしれないので、混乱を招くかもしれないと心配している。
3)void
の代わりにIEnumerable<T>
が返された場合、それは悪いコードでしょうか?私はそれが不公平である限り、それは鎖を変更するものを連鎖させることを奨励するので、はい、それは非常に悪いコードになると思います。たとえば、この悪いコードですか?
// possibly bad extension
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
action(item);
return source;
}
優れた応答。 –