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

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: