Функциональное программирование печати чисел, кратных 2 - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь изучить функциональное программирование, и я пишу функцию, которая печатает числа, делимые на 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);
        }
    } 

1 Ответ

0 голосов
/ 27 февраля 2019

Если вы хотите написать «функциональный» код на 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.

...