Какой язык позволяет расширять область действия подпрограмм автоматом?

durka82

Какой язык позволяет, описав действие над элементом, использовать его над любой коллекцией таких элементов (хотя бы над массивом произвольной размерности)?
Шаблоны С такое позволяют?

bobby

haskell

Dasar

> Какой язык позволяет, описав действие над элементом, использовать его над любой коллекцией таких элементов (хотя бы над массивом произвольной размерности)?
ответ - любой язык.
по степени удобства (в убывающем порядке):
ФЯ
C# 2.0
C++
C/Паскаль

durka82

Прям уж таки и любой?
Как это достигается в:
C# 2.0
C++
C/Паскаль
, например?
Конкретно сейчас я пишу прогу на фортране - мб ты знаешь и как здесь этого достичь?
А то многие библиотечные подпрограммы так как раз умеют, только вот исходников с IVF не поставляется
Но подозреваю, что это делается отнють не автоматом

Dasar

c# 2.0

void Output(int i)
{
  Console.WriteLine("xx{0}xx", i);
}
delegate void Executter<T>(T item);
void ForEach<T>(IEnumerable<T> items, Executtor<T> executtor)
{
   foreach (T item in items)
     executtor(item);
}
void Main
{
    ForEach(new int[]{1, 5, 3}, new Executter<int>(Output;
}

C++: аналогично с# 2.0
C

void Output(int i)
{
   printf("%l", i);
}
typedef void Executtor_Int(int item);
 //всего Foreach_ей надо по кол-ву встроенных типов + один для void*
void Foreach_Int(int * items, int size, Executtor_Int executtor)
{
   for (int i = 0; i < size; ++i)
     executtor(items[i]);
}
void main
{
    int items[] = {1, 3, 5};
    ForEach_Int(items, 3, Output);
}

durka82

Круто, спасибо

psihodog

> C++: аналогично с# 2.0
странно, почему ты тогда их на одну строчку не поставил?
python:
B=[f(x) for x in A]
или
B=(f(x) for x in A)
в зависимости от нужд. Ну в данном случае питон можно отнести к ФЯ.

Dasar

> странно, почему ты тогда их на одну строчку не поставил?
потому что в C# 2.0, есть делегаты и анонимные делегаты, а в C++ - приходится всегда вводить фиктивные функции или классы

rosali

По идее boost::lambda должно быть достаточно.
Оставить комментарий
Имя или ник:
Комментарий: