C# 函数式编程打印可被2整除的数字
我正在学习函数式编程,我正在编写一个函数,它可以输出可除2的数字。我知道在函数式编程中,它应该避免循环,并且应该具有引用透明性,所以变量应该是不可变的。这就是我写的函数,这是否符合函数编程范式C# 函数式编程打印可被2整除的数字,c#,functional-programming,C#,Functional Programming,我正在学习函数式编程,我正在编写一个函数,它可以输出可除2的数字。我知道在函数式编程中,它应该避免循环,并且应该具有引用透明性,所以变量应该是不可变的。这就是我写的函数,这是否符合函数编程范式 public static void evenNumbers(int start, int end) { if (start <= 20) { if (start % 2 == 0) { System.Console.Writ
public static void evenNumbers(int start, int end)
{
if (start <= 20)
{
if (start % 2 == 0)
{
System.Console.WriteLine(start);
}
evenNumbers(start + 1, end);
}
}
public静态空数(int开始,int结束)
{
if(start如果您想用c#编写“函数”代码,请使用LINQ扩展方法
var valuesToPrint =
Enumerable.Range(start, end - start)
.Where(value => number % 2 == 0)
.Select(value => value.ToString());
var output = String.Join(Environment.NewLine, valuesToPrint)
// Console is external resource (aka global state)
Console.WriteLine(output);
如果您非常喜欢LINQ,可以使用.Aggregate
扩展方法构建输出
var output =
Enumerable.Range(start, end - start)
.Where(value => number % 2 == 0)
.Aggregate(new StringBuilder(),
(builder, value) => builder.AppendLine(value),
builder => builder.ToString());
Console.Write(output);
有些人会争论Aggregate
和StringBuilder
不是纯粹的函数,因为我们更新了StringBuilder
的同一个实例的内部状态,如果你试图学习函数式编程,那么为什么不使用函数式语言,比如F#?如何定义question1
函数式编程ach将返回一系列匹配的数字,而不是执行作为进程一部分的副作用(如Console.WriteLine
)。我认为在内部调用Console.WriteLine已经破坏了此函数的功能性质。要适合FP,您的函数应该返回列表,而不是打印它。如果我更改System.Console.WriteLink(启动)返回启动是否有效?如果列表不是很大,我们可以考虑替换字符串。加入<代码>。聚合((a,x)=a+,“+x”< /代码> @ Matt。G,我建议使用<代码>聚合< /代码> <代码> StringBuilder < /C> >,然后此方法也适用于更大的集合。
var output =
Enumerable.Range(start, end - start)
.Where(value => number % 2 == 0)
.Aggregate(new StringBuilder(),
(builder, value) => builder.AppendLine(value),
builder => builder.ToString());
Console.Write(output);