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

Re: kylix 2



Evening, Andrei. 

Andrei Sosnin <demonsly@hot.ee> 22:29 9/1/2003 wrote:

>> Нет. В С нельзя создать и вернуть функцию как результат. Пример:
>> makeAdder x = map (+x)
>> makeAdder имеет тип:
>> forall a. (Num a) => a -> ([a] -> [a])
[skip]

>> другой пример:
>> overloadFunctionAtSpecificPoint function point value =
>>   (\x -> if x == point then value else function(point))
>> Ее тип:
>> forall t a. (Eq a) => (a -> t) -> a -> t -> (a -> t)
[skip]

>> В c/c++ так сделать нельзя.

 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]


 AS> Разницу я только вижу в гибкости кода и его просте. Думаю, на
 AS> ассемблере это выглядело бы еще сложнее... ;-)
Как следует из пока что не опровергнутого тезиса Черча, ассемблер, С,
Haskell и все остальные языки програмирования одинаковы в смысле мощности
множества задач, которые можно решить с их помощью. Но не одинаковы с точки
зрения читаемости и сопровождаемости кода и времени, требуемого на его
написания. И простота кода in the long run становится чуть ли не решающим
фактором.

 AS> Но этот код говорит о том, что все же совсем необязательно функции
 AS> возвращать другую функцию. Можно вернуть ее возращаемое значение.
 AS> Но очевидно, однако, что Haskel позволяет значительно упростить код,
 AS> что иногда весьма полезно.
Понимание того, как важна простота и читаемость кода приходит обычно в
процессе работы с legacy кодом на >100000 строк на С ....

>>  AS> Кстати, не свзяано ли это с понятием "чисто функции" (pure
>> function)?  AS> (Чтобы тут потом тоже не придумывать несуществующие
>> связи)
>> pure abstract method из C++? Нет, совсем не связано.

 AS> Нет, именно "pure function". Объясняется как "функция, вычисляющая
 AS> свое значение исключительно на основе данных аргументов", то есть
Тогда уже "чистая функция" или "функция, свободная от побочных эффектов".

 AS> гарантирующая один и тот же ответ при одних и тех же значениях
 AS> аргументов при выполнении в разное время. Прочитал в одном из
 AS> глоссариев (нашел в Гугле), там же где и про императивное и
 AS> функциональное программирование.
Да, в таком трактовании - имеет самое непосредственное отношение.


-- 
Dmitry Astapov //ADEpt                               E-mail: adept@umc.com.ua
GPG KeyID/fprint: F5D7639D/CA36 E6C4 815D 434D 0498  2B08 7867 4860 F5D7 639D



Reply to: