Evening, Andrei. Andrei Sosnin <[EMAIL PROTECTED]> 18:52 9/1/2003 wrote:
>> Если в языке функции "равны в правах" с данными - т.е. их можно >> свободно >> перевать, возвращать, создавать и т.п., то они являются first-class >> citizens. Это устоявшийся оборот такой :) AS> Если считать С, например, функциональным языком, то тогда на вопрос AS> отвечу положительно. Там можно использовать функции во всех AS> конструкциях, где допустимо использование переменных. То есть функции AS> равны в правах с переменными (данными). Нет. В С нельзя создать и вернуть функцию как результат. Пример: makeAdder x = map (+x) makeAdder имеет тип: forall a. (Num a) => a -> ([a] -> [a]) , т.е. (makeAdder 5) вернет функцию, которая принимает в качестве аргумента список чисел, увеличивает каждое из них на 5, и возвращает в качестве результата. другой пример: overloadFunctionAtSpecificPoint function point value = (\x -> if x == point then value else function(point)) Ее тип: forall t a. (Eq a) => (a -> t) -> a -> t -> (a -> t) Для данной функции function от одного аргумента (над которым определена операция ==) возвращает новую функцию, значение которой совпадает со старой во всех точках, кроме точки "point". В точке "point" новая функция имеет значение "value". Пример: Prelude> let overloadFunctionAtSpecificPoint function point value = (\x -> if x == point then value else function(point)) Prelude> let fun x = x+2 Prelude> fun 5 7 Prelude> let fun2 = overloadFunctionAtSpecificPoint fun 5 11 Prelude> fun2 5 11 Prelude> fun2 3 7 В c/c++ так сделать нельзя. >> AS> functional programming >> AS> This style of programming proceeds by computing new values from >> AS> existing values without changing any of the existing values. >> AS> imperative programming >> AS> This style of programming proceeds by altering values stored in >> variables. >> AS> Т.е. функциональное программирование - это вычисление новых >> значений >> AS> без изменения существующих переменных, императивное - посредством >> Я бы сказал, что у чисто функциональных языков остуствует понятие >> "переменной" вообще. Это было бы точнее. AS> А есть такие чисто функциональные языки? Есть. Называются Haskell, Clean. Наверняка есть и другие. Все примеры, которые я приводил до сих пор - на Haskell. AS> Кстати, не свзяано ли это с понятием "чисто функции" (pure function)? AS> (Чтобы тут потом тоже не придумывать несуществующие связи) pure abstract method из C++? Нет, совсем не связано. -- Dmitry Astapov //ADEpt E-mail: [EMAIL PROTECTED] GPG KeyID/fprint: F5D7639D/CA36 E6C4 815D 434D 0498 2B08 7867 4860 F5D7 639D