LINUX.ORG.RU

История изменений

Исправление encyrtid, (текущая версия) :

1. Я не могу в твою реализацию мапа (MyMap) передать, простой метод, например метод класса String «length()» для подсчета строк в списке слов? Согласись, это большой недостаток.

Нет в C# метода String.length(), Length - это Property. А так, любой метод можно передать без проблем:

var list4 = MyMap(string.IsNullOrEmpty, list); // список bool

2. Не находишь, что реализация немного длиннее, чем это

(defn map* [res f col]
  (if (empty? col)
    res
    (recur (conj res (f (first col))) f (rest col))))

(defn map [f col] (map* [] f col))

Реализация непосредственно map - это те же 6 строк:

private static IList<TOut> MyMap<TIn, TOut>(Func<TIn, TOut> f, IList<TIn> list)
{
     var result = new List<TOut>(list.Count);
     foreach(var i in list)
         result.Add(f(i));
     return result;
}
К тому же C# - статически типизированный язык, здесь много место занимает описание сигнатур. Для протокола: факт что в функциональных языках объем кода, как правило, меньше чем в императивных я не оспариваю.

Который к тому же не делает исключений для функций, т.к. функции в языке не разделены искусственно на функторы и прочие.

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

// определение типов которые можно использовать в качестве сигнатур аргуметов функций
delegate TOut MyFunc<TIn, TOut>(TIn x);
delegate void MyAction<TIn>(TIn x);
Func, Action - это просто предопределенные в библиотеке делегаты, для удобства. Во всех случаях где используются делегаты можно передавать любой метод с совпадающей сигнатурой.

Исходная версия encyrtid, :

1. Я не могу в твою реализацию мапа (MyMap) передать, простой метод, например метод класса String «length()» для подсчета строк в списке слов? Согласись, это большой недостаток.

Нет в C# метода String.length(), Length - это Property. А так, любой метод можно передать без проблем:

var list4 = MyMap(string.IsNullOrEmpty, list); // список bool

2. Не находишь, что реализация немного длиннее, чем это

(defn map* [res f col]
  (if (empty? col)
    res
    (recur (conj res (f (first col))) f (rest col))))

(defn map [f col] (map* [] f col))

Реализация непосредственно map - это те же 6 строк:

private static IList<TOut> MyMap<TIn, TOut>(Func<TIn, TOut> f, IList<TIn> list)
{
     var result = new List<TOut>(list.Count);
     foreach(var i in list)
         result.Add(f(i));
     return result;
}
К тому же C# - статически типизированный язык, здесь много место занимает описание сигнатур. Для протокола: факт что в функциональных языках объем кода, как правило, меньше чем в императивных я не оспариваю.

Который к тому же не делает исключений для функций, т.к. функции в языке не разделены искусственно на функторы и прочие.

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

// определение типов которые можно использовать в качестве сигнатур аргуметов функций
delegate TOut MyFunc<TIn, TOut>(TIn x);
delegate void MyAction<TIn>(TIn x);
Func, Action - это просто предопределенные в библиотеке делегаты, для удобства. Во всех случаях где используются делегаты можно передавать любой метод с совпадающей сигнатурой.