Dmitry Astapov wrote:
AS> То есть, другими словами, Haskel позволяет перегружать функции таким
AS> вот странным (для человека, ранее кроме как с С, С++, Паскаль, Питон и
AS> пр. ни с чем больше не встречавшегося) образом. Сложно для понимания,
AS> по крайней мере сначала.
Нет. Идея тут не в том, что можно перегружать функции (просто у меня пример
такой получился). Идея в том, что можно создать и вернуть объект типа "функция".
AS> Аналогичный код на С:
Нет. Совсем не аналогичный. Мы же не говорим о решении конкретной задачи, а
о демонстрации определенных принципов.
AS> #include <stdio.h>
AS> #define POINT_V 64
AS> #define VALUE_V 129
AS> int function(int x, int (*what_to_do)(int pnt), int point, int value);
AS> int function2(int x);
Вопросы:
1)Что надо сделать, чтобы решение работало для произвольных функций a -> b,
а не только для функций int -> int? При этом, решение должно быть type
safe.
В С это не предусмотрено. Зато предусмотрено в С++ (по крайней мере,
косвенно).
AS> int main(int argc, char argv[]){
AS> printf("function2 does: VALUE_V + 365; VALUE is: 129\n");
AS> printf("Function returned on x == POINT_V: %i\n",
AS> function(POINT_V, &function2, POINT_V, VALUE_V));
AS> printf("Function returned on x != POINT_V: %i\n",
AS> function(POINT_V+34, &function2, POINT_V, VALUE_V));
2)В моем примере, overloadFunctionAtSpecificPoint возвращает объект типа
"функция", который затем можно использовать везде, где можно использовать
обычную функцию. Как сделать такое в С? Чтобы было что-то вроде:
new_function = function(&function2, POINT_V, VALUE_V));
printf("It works: %d!\n", new_function(5));
AS> return 0;
AS> }
[skip]
Так, что такое функция? - Я понимаю так: это некоторое выражение вида:
a = f(x, y, [...])
с одним или несколькими изменяемыми аргументами, на основе которых
собственно функция (как абстракция данного выражения) принимает то или
иное значение. Это математический смысл функции в моей вольной трактовке.
Что с функцией можно сделать? - Можно вычислить ее значение на основе
данных значений ее аргументов.
Но зачем может быть необходимо функции возвращать не собственное
значение, а другую функцию? (Это противоречит моему пониманию функции,
которое со школьной скамьи всем известно, и этого парадокса не понимаю)
Как математически это можно представить?
AS> Разницу я только вижу в гибкости кода и его просте. Думаю, на
AS> ассемблере это выглядело бы еще сложнее... ;-)
Как следует из пока что не опровергнутого тезиса Черча, ассемблер, С,
Haskell и все остальные языки програмирования одинаковы в смысле мощности
множества задач, которые можно решить с их помощью. Но не одинаковы с точки
зрения читаемости и сопровождаемости кода и времени, требуемого на его
написания. И простота кода in the long run становится чуть ли не решающим
фактором.
Не могу не согласиться. Выбор языка программирования делает программист,
а не пользователь. А программист, как любой нормальный человек, не
стремиться слишком усложнять себе жизнь, поэтому пытается пользоваться
как можно более простыми для него и его задач решениями. :-)
AS> Но этот код говорит о том, что все же совсем необязательно функции
AS> возвращать другую функцию. Можно вернуть ее возращаемое значение.
AS> Но очевидно, однако, что Haskel позволяет значительно упростить код,
AS> что иногда весьма полезно.
Понимание того, как важна простота и читаемость кода приходит обычно в
процессе работы с legacy кодом на >100000 строк на С ....
Да уж оно и так понятно. :-) Я не понимаю, как некоторые парадоксальные
(противоречащие традиционному пониманию) особенности (как возвращение
функции функцией) могут помочь с читаемостью и простотой кода? В первую
очередь, с читаемостью? Конечно, я понимаю, что с привычкой это
становится легче, но... Признаюсь честно, в данный момент я остального
решительно не понимаю. :-)
--
Andrei Sosnin
http://zzx.ath.cx
<!-- : it all depends on your vision : -->