Re: kylix 2
On Fri, Jan 10, 2003 at 12:41:17PM +0200, Dmitry Astapov wrote:
>
> 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));
Да, это можно используя свойство языка С++ - шаблоны.
..
А я вот хотел спросить - как делают структуры в лиспе (разных диалектах)?
Или обходятся списками, и считают элементы с определенным индексом - членами?
А в Haskel/Erlang/Clean - также, или все-таки есть аналог структур С?
--
Best regards,
-Vlad
Reply to: