Re: kylix 2
Evening, Andrei.
Andrei Sosnin <demonsly@hot.ee> 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: adept@umc.com.ua
GPG KeyID/fprint: F5D7639D/CA36 E6C4 815D 434D 0498 2B08 7867 4860 F5D7 639D
Reply to: