[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: kylix 2





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 : -->



Reply to: