代码之家  ›  专栏  ›  技术社区  ›  Rubiks

函数式程序设计打印可被2整除的数

  •  0
  • Rubiks  · 技术社区  · 6 年前

    我试图学习函数式编程,我正在写一个函数,打印数字可除2。我知道在函数式编程中,它应该避免循环,并且应该具有引用透明性,所以变量应该是不可变的。这就是我写的函数,它是否符合函数式编程范式?

    public static void evenNumbers(int start, int end)
    {
    
        if (start <= 20)
        {
            if (start % 2 == 0)
            {
                System.Console.WriteLine(start);
            }
            evenNumbers(start + 1, end);
        }
    } 
    

    我对代码做了一些修改

    public static void evenNumbers(int start, int end)
        {
    
            if (start <= 20)
            {
                if (start % 2 == 0)
                {
                    return start;
                }
                evenNumbers(start + 1, end);
            }
        } 
    
    0 回复  |  直到 6 年前
        1
  •  3
  •   Fabio    6 年前

    如果您想用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);
    

    .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 不是纯函数的,因为我们更新了的同一个实例的内部状态 .