Проблема: Более опрятный способ приправить карри или частично применить строку C#4. Соединение

Фон

Я недавно считал ту.NET 4 Система. Строковый класс имеет новую перегрузку метода Соединения. Эта новая перегрузка берет разделитель, и IEnumerable который позволяет произвольным наборам быть присоединенными в единственную строку без потребности преобразовать в промежуточный массив строк.

Круто! Это означает, что я могу теперь сделать это:

var evenNums = Enumerable.Range(1, 100)
    .Where(i => i%2 == 0);
var list = string.Join(",",evenNums);

... вместо этого:

var evenNums = Enumerable.Range(1, 100)
    .Where(i => i%2 == 0)
    .Select(i => i.ToString())
    .ToArray();
var list = string.Join(",", evenNums);

... таким образом экономя на преобразовании каждого объекта к строке и затем выделении массива.

Проблема

Однако будучи вентилятором функционального стиля программирования в целом и объединения в цепочку метода в C#, в частности, я предпочел бы мочь записать что-то вроде этого:

var list = Enumerable.Range(1, 100)
    .Where(i => i%2 == 0)
    .string.Join(",");

Это не легальный C# все же. Да, я мог сделать это с Enumerable.Aggregate, и да, я мог сделать это со своим собственным методом расширения Соединения), но те подходы трудны к чтению / неэффективны и чувствуют себя подобно отговорке (соответственно), таким образом, я хотел бы попытаться сделать его другой путь. Самое близкое, которое мне удалось получить до сих пор, это:

var list = Enumerable.Range(1, 100)
    .Where(i => i%2 == 0)
    .ApplyTo(
        Functional.Curry, string>
            (string.Join)(",")
    );

... использование следующих дополнительных методов:

public static class Functional
{
    public static TRslt
    ApplyTo(this TArg arg, Func func)
    {
        return func(arg);
    }

    public static Func>
    Curry(this Func func)
    {
        Func, Func>> curried
            = f => x => y => f(x, y);
        return curried(func);
    }
}

Это является довольно подробным, требует явного определения параметров и типа возврата строки. Перегрузка соединения я хочу использовать, и полагается на функции различия C#4, потому что мы определяем один из аргументов как IEnumerable, а не IEnumerable.

Проблема

Можно ли найти более опрятный способ достигнуть этого использования объединяющего в цепочку метод стиля программирования?

Эта проблема о попытке найти краткий путь, в C#, приправить карри функцию, которая имеет несколько перегрузок - и это только для забавы!

6
задан Community 23 May 2017 в 12:34
поделиться

1 ответ

Что не так с:

var list = string.Join(",",Enumerable.Range(1, 100).Where(i => i%2 == 0));

Я действительно не понимаю, почему это не так функциональное программирование. Это меньше цепочек, правда. Но функциональная программа не связана с цепочкой, а с написанием более декларативных операторов, что и делается в моей книге. Конечно, если вы действительно хотите, чтобы он был связан цепочкой, вы можете сделать следующее: Каким LINQ-способом можно взорвать / присоединить массив строк?

6
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: