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