Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> О функциональном программировании на Python 
:(
    Опции темы
Artemios
Дата 24.8.2006, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



P.S. А вообще, вот интересная статейка о функциональном программировании на Python (если знаком с лиспом - должно понравиться smile )


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
pythonwin
Дата 24.8.2006, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(Artemios @  24.8.2006,  07:38 Найти цитируемый пост)
P.S. А вообще, вот интересная статейка о функциональном программировании на Python (если знаком с лиспом - должно понравиться smile

За ссылку спасибо! smile
С лиспом не знаком. smile
PM WWW GTalk Jabber   Вверх
albertn
Дата 24.8.2006, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(Artemios @ 24.8.2006,  00:38)
P.S. А вообще, вот интересная статейка о функциональном программировании на Python (если знаком с лиспом - должно понравиться smile )

Но по моему они зря сравнивают свои Короткозамкнутые функции с функцией COND. На сколько я понимаю, 
Код

x=1
y=-1
print x==0 and y or x==1 and y+1 or x==2 and y+2 or y+3

Вернет совсем не 0, а 2. А для обхода этой ситуации придется толи менять условия, толи менять возвращаемое значение.
А лисп это вещь, если конечно не это бесконечное количество скобок  smile

Добавлено @ 09:03 
Цитата(Artemios @ 23.8.2006,  23:59)
Код

ll = map(lambda x: (x.s1, x.s2), l) or [(-1, '-1')]


или

Код

ll = [(x.s1, x.s2) for x in l] or [(-1, '-1')]


 smile ну да, изврат. smile короткозамкнутое логическое выражение.

Че-то я забыл, что пустой список это тоже False
PM WWW ICQ   Вверх
pythonwin
Дата 24.8.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(albertn @  24.8.2006,  16:01 Найти цитируемый пост)
Че-то я забыл, что пустой список это тоже False 

Код

[] or [1] == [1]


Спасибо, - пригодилось!

PM WWW GTalk Jabber   Вверх
Artemios
Дата 24.8.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(albertn @ 24.8.2006,  09:01)
Но по моему они зря сравнивают свои Короткозамкнутые функции с функцией COND. На сколько я понимаю, 
Код

x=1
y=-1
print x==0 and y or x==1 and y+1 or x==2 and y+2 or y+3

Вернет совсем не 0, а 2. 


Полной аналогии с COND наверно не получится:
Код

(x==0 and y) or (x==1 and y+1) or (x==2 and y+2) or y+3

будет 2, так как
Код

(x==0 and y) == False
(x==1 and y+1)==0 # короткого замыкания для or нет и цепочка вычисляется дальше:
(x==2 and y+2) == False
(y+3) ==2


Цитата(albertn @ 24.8.2006,  09:01)
А для обхода этой ситуации придется толи менять условия, толи менять возвращаемое значение.

Да, для аналогии с COND нужно, чтобы в мультиселекте в паре (a and b) второй элемент (возвращаемое значение b) никогда не был нулевым/пустым/ложным/etc, например:
Код

(x==0 and [y]) or (x==1 and [y+1]) or (x==2 and [y+2]) or [y+3]

вернет [0]. А это уже извращение smile , но я думаю, у нас нет задачи полностью повторять лисп smile 


Это сообщение отредактировал(а) Artemios - 24.8.2006, 19:23


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
albertn
Дата 25.8.2006, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(Artemios @  24.8.2006,  18:01 Найти цитируемый пост)
Да, для аналогии с COND нужно, чтобы в мультиселекте в паре (a and b) второй элемент (возвращаемое значение b) никогда не был нулевым/пустым/ложным/etc

А также можно сделать, чтобы условия не пересикались, тогда результат будет аналогичным
Код

print x==0 and y or x==1 and y+1 or x==2 and y+2 or (x<0 or x>2) and y+3

Но это тоже не всегда удобно.
Кстати, в случае чего можно написать свою функцию типа сишного ?:, как сделали в Zope, или даже  саму функцию COND. Возможно даже это будет иметь смысл.
PM WWW ICQ   Вверх
Artemios
Дата 25.8.2006, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(albertn @  25.8.2006,  08:41 Найти цитируемый пост)
Кстати, в случае чего можно написать свою функцию типа сишного ?:, как сделали в Zope, или даже  саму функцию COND. Возможно даже это будет иметь смысл. 

Можно и весь лисп прикрутить в качестве расширяемого модуля smile Есть же его сишные исходники smile 


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
albertn
Дата 25.8.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(Artemios @ 25.8.2006,  13:12)
Можно и весь лисп прикрутить в качестве расширяемого модуля smile Есть же его сишные исходники smile

Ну если так посмотреть, то в питоне есть почти все, что необходимо для лиспа.
Ну че, организуем проект?
PM WWW ICQ   Вверх
pythonwin
Дата 25.8.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



тогда лучше создать отдельную тему в форуме.


Цитата(albertn @  25.8.2006,  20:31 Найти цитируемый пост)
Ну че, организуем проект? 

я  - за! Но знаний по лиспу нет.
PM WWW GTalk Jabber   Вверх
Artemios
Дата 25.8.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Эх, оффтопик, но для отдельной темы наверно это пока будет излишне...
Цитата(Artemios @  25.8.2006,  13:12 Найти цитируемый пост)
Можно и весь лисп прикрутить в качестве расширяемого модуля

Цитата(albertn @  25.8.2006,  13:31 Найти цитируемый пост)
Ну если так посмотреть, то в питоне есть почти все, что необходимо для лиспа.
Ну че, организуем проект? 

Цитата(pythonwin @  25.8.2006,  13:56 Найти цитируемый пост)
я  - за! Но знаний по лиспу нет. 


У меня по лиспу тоже мало знаний. Есть такие соображения.
Если нам нужен чистый функциональный лисп (без ОО), то здесь вообще проблем не должно быть. Единственное, что потребуется - реализовать на си преобразование:
питоновский список <--> лисповский список.

Другой вопрос: а нужно ли это? То же самое со списками мы можем и питоном делать. 
Как в лиспе программа - это такой же список, как и данные, - так и в питоне программа - это такой же объект, как и другие объекты. То есть, если нам нужны не только преобразования списочных данных, но и динамическая генерация/модификация программного кода - то это позволяет и питон (функции высших порядков, метаклассы).
Такое вот ИМХО smile 


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
pythonwin
Дата 27.8.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(Artemios @  26.8.2006,  02:40 Найти цитируемый пост)

Другой вопрос: а нужно ли это? То же самое со списками мы можем и питоном делать. 
Как в лиспе программа - это такой же список, как и данные, - так и в питоне программа - это такой же объект, как и другие объекты. То есть, если нам нужны не только преобразования списочных данных, но и динамическая генерация/модификация программного кода - то это позволяет и питон (функции высших порядков, метаклассы).
Такое вот ИМХО smile  


предлагаю написать функции, которые эмулировали работу со списками или написать класс потомок списка и класс потомок словаря, у которых были бы специфические методы и свойства.

PM WWW GTalk Jabber   Вверх
Cr@$h
Дата 27.8.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



PM MAIL ICQ   Вверх
Void
Дата 27.8.2006, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Почти в тему smile
Набрёл случайно по ссылкам на следующий ASPN Cookbook recipe: List/Generator Monad Combinators.
Отрывок кода:
Код
class Infix:
  def __init__(self, function):
      self.function = function
  def __ror__(self, other):
      return Infix(lambda x, self=self, other=other: self.function(other, x))
  def __or__(self, other):
      return self.function(other)
  def __call__(self, value1, value2):
      return self.function(value1, value2)

...

@Infix
def mplus(g1, g2):
    return chain(g1, g2)

...
parser = hexParser |mplus| digitParser |mplus| wordParser

Отдавая должное изобретательности автора этого кода, лично у меня возникают ассоциации с шаблонным метапрограммированием в С++: выглядит круто, но на практике проще пользоваться языками и инструментами, изначально ориентированными на такой род задач. Могу ошибаться smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
setq
Дата 27.8.2006, 23:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Void @  27.8.2006,  23:21 Найти цитируемый пост)
выглядит круто


+1
  Вверх
pythonwin
Дата 28.8.2006, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Cr@$h, спасибо!
PM WWW GTalk Jabber   Вверх
Cr@$h
Дата 28.8.2006, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(pythonwin @  28.8.2006,  08:18 Найти цитируемый пост)
Cr@$h, спасибо! 

Развлекайтесь. Мне самому первая статья понравилась очень.
PM MAIL ICQ   Вверх
Artemios
Дата 28.8.2006, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(Cr@$h @  28.8.2006,  15:25 Найти цитируемый пост)
Развлекайтесь. Мне самому первая статья понравилась очень. 


Ну тогда вот продолжения того же автора:

http://www.citforum.ru/programming/python/python8.shtml

http://www.citforum.ru/programming/python/python9.shtml

В этих двух статьях он рассматривает специфический модуль для ФП. Модуль достаточно древний, 2001 г., но интересный, наверно не потребуется и этого:
Цитата(pythonwin @  27.8.2006,  15:48 Найти цитируемый пост)
предлагаю написать функции, которые эмулировали работу со списками или написать класс потомок списка и класс потомок словаря, у которых были бы специфические методы и свойства.



http://www.citforum.ru/programming/python/python10.shtml

А здесь тот же автор рассматривает появившиеся с питона 2.2 итераторы и отложенные вычисления ФП, а также сетует на отсутствие в питоне по аналогии со списковыми включениями итераторных включений. Только, с питона 2.5, кажется эта проблема решена - т.н. генераторные включения, если не ошибаюсь, сам не пользовал - у меня 2.4.3.



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Cr@$h
Дата 28.8.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(Artemios @  28.8.2006,  21:41 Найти цитируемый пост)
В этих двух статьях он рассматривает специфический модуль для ФП. Модуль достаточно древний, 2001 г.

Возможно, с Python 2.5+ некоторые средства модуля ФП уже являются родными для языка и реализовывать их руками нет смысла. Спасибо за ссылки, почитаю. ++
PM MAIL ICQ   Вверх
Artemios
Дата 28.8.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(albertn @ 25.8.2006,  08:41)
А также можно сделать, чтобы условия не пересикались, тогда результат будет аналогичным
Код

print x==0 and y or x==1 and y+1 or x==2 and y+2 or (x<0 or x>2) and y+3

Но это тоже не всегда удобно.

albertn, прости, сразу невнимательно смотрел, пропустил.
Твой пример возвращает False по первому элементу последней пары, а по логике COND первые элементы вообще невозвращаются, нам был нужен 0 по второму элементу второй пары.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
setq
Дата 28.8.2006, 23:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Artemios, генераторные включения есть в 2.4

Код

>>> (x for x in [1,2,3]).next()
1
>>> 


  Вверх
Artemios
Дата 29.8.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(setq @ 28.8.2006,  23:49)
Artemios, генераторные включения есть в 2.4

Код

>>> (x for x in [1,2,3]).next()
1
>>> 

О как! Спасибо огромнейшее, не забуду. Или кто-нибудь плз ++setq.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Cr@$h
Дата 29.8.2006, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(Artemios @  29.8.2006,  01:51 Найти цитируемый пост)
О как! Спасибо огромнейшее, не забуду. Или кто-нибудь плз ++setq. 


M
Cr@$h
Ну, конечно ++.

PM MAIL ICQ   Вверх
Artemios
Дата 1.9.2006, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



из: http://forum.vingrad.ru/index.php?showtopi...st&p=838866
Цитата(albertn @ 31.8.2006, 08:57)
Но если присмотреться, то есть функции чисто императивные, я подчеркну, что это именно функции (операторы простительно), такие как sort, reverse, и другие, которые не возвращают результат, а все операции производят над исходным списком.

Так это вроде бы и не функции - методы класса list ... 


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
albertn
Дата 1.9.2006, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(Artemios @ 1.9.2006,  01:04)
Так это вроде бы и не функции - методы класса list ...

Многие функции функционального программирования реализуются через методы класса list. Ведь не все же функции, имеющиеся в этом классе реализованы как отдельные функции, поэтому я говорю, что они реализованы как чисто императивные.
PM WWW ICQ   Вверх
Artemios
Дата 1.9.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



albertn, прости пожалуста, я наверно тебя не очень понимаю, так как не очень хорошо знаком с ФП.

Как я понимаю ФП, это суперпозиция функций первого и более высших порядков от списочных аргументов, в идеале функции неимеют побочных эффектов.

А в ООП - нечто противоположное - методы объекта - для работы с данными объекта и их изменения, то есть все и завязано на побочных эффектах методов, если их рассматривать как функции от объектов.

То есть, для достижения функциональности, как мне кажется, должна быть некоторая внутренне императивная обертка вроде:
Код

def fp_sort(lst,cmp=None):
        lst1 = lst[:]
        return lst1.sort(cmp=cmp) or lst1


Это сообщение отредактировал(а) Artemios - 1.9.2006, 11:37


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
albertn
Дата 1.9.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(Artemios @ 1.9.2006,  11:36)
albertn, прости пожалуста, я наверно тебя не очень понимаю, так как не очень хорошо знаком с ФП.

Как я понимаю ФП, это суперпозиция функций первого и более высших порядков от списочных аргументов, в идеале функции неимеют побочных эффектов.

А в ООП - нечто противоположное - методы объекта - для работы с данными объекта и их изменения, то есть все и завязано на побочных эффектах методов, если их рассматривать как функции от объектов.

То есть, для достижения функциональности, как мне кажется, должна быть некоторая внутренне императивная обертка вроде:
Код

def fp_sort(lst,cmp=None):
        lst1 = lst[:]
        return lst1.sort(cmp=cmp) or lst1

Ты все верно понимаешь. Если бы в Python эти функции были реализованы, то тогда о нем можно было-бы говорить как о  ФП. А так в нем есть только включения, упрощающие функционального программирования.

Конечно можно дописать эти недостоющие функции, но дописать их можно и в любом другом языке без особых проблем.

А про побочные действия это ты зря. Там скорее не про побочные действия, а про то, что никакая функция не должна изменять переданные ей аргументы, а возвращать новый измененный аргумент.
PM WWW ICQ   Вверх
Void
Дата 1.9.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Цитата(albertn @  1.9.2006,  14:10 Найти цитируемый пост)
Там скорее не про побочные действия, а про то, что никакая функция не должна изменять переданные ей аргументы, а возвращать новый измененный аргумент.

Второе есть необходимое, но не достаточное условие первого.

Давайте разделять понятия: Питон позволяет писать в функциональном стиле, поскольку функции в нём являются первоклассными объектами, есть замыкания и функции высшего порядка. Питон не является чисто функциональным языком, поскольку не только позволяет побочные эффекты, но и не препятствует им. До звания функционального языка он, на мой взгляд, не дотягивает из-за отсутствия оптимизации хвостовой рекурсии (я тут приводил пример, как её реализовать с помощью декораторов, но это хак и притом медленный хак).


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Artemios
Дата 2.9.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(Void @  1.9.2006,  17:07 Найти цитируемый пост)
До звания функционального языка он, на мой взгляд, не дотягивает из-за отсутствия оптимизации хвостовой рекурсии (я тут приводил пример, как её реализовать с помощью декораторов, но это хак и притом медленный хак). 

Нашел там же еще примерчики:
Tail Recursion Decorator
Tail Call Optimization Decorator


Это сообщение отредактировал(а) Artemios - 2.9.2006, 00:52


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 2.9.2006, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50





--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 4.9.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(Artemios @  1.9.2006,  01:04 Найти цитируемый пост)
Но если присмотреться, то есть функции чисто императивные, я подчеркну, что это именно функции (операторы простительно), такие как sort, reverse


Цитата(Artemios @  1.9.2006,  11:36 Найти цитируемый пост)
для достижения функциональности, как мне кажется, должна быть некоторая внутренне императивная обертка вроде:


С питона 2.4, оказывается есть и функциональные аналоги: sorted, reversed:
Цитата

class reversed(object)
 |  reversed(sequence) -> reverse iterator over values of the sequence

sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list



Тихо сам с собою я веду беседу, 
не мешайте разговаривать с умным человеком smile


Это сообщение отредактировал(а) Artemios - 4.9.2006, 16:30


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Cr@$h
Дата 4.9.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Здорово. Я же говорил очевидную вещь
Цитата(Cr@$h @  28.8.2006,  22:11 Найти цитируемый пост)
Возможно, с Python 2.5+ некоторые средства модуля ФП уже являются родными для языка и реализовывать их руками нет смысла. 


Так что теперь
Цитата(Artemios @  4.9.2006,  17:28 Найти цитируемый пост)
С питона 2.4, оказывается есть и функциональные аналоги: sorted, reversed:

а
Цитата(albertn @  1.9.2006,  13:10 Найти цитируемый пост)
Если бы в Python эти функции были реализованы, то тогда о нем можно было-бы говорить как о  ФП. 

Ну, по этим двум зачот. А что осталось собственно? Tail recursion и чистота функций, как минимум.
Кстати, про хвостовую рекурсию. Компилятор/интерпретатор делает оптимизацию прозрачно, да? В некоторых языках давно есть, посмотрите в Python.

Artemios, а сам с собой говорить не стоит -- первый признак шизофрении.  smile Да просто мы читаем да обдумываем, что ты тут выложил. На вот посмотри Iterators and Simple Generators, пока сюда никто не отвечает  smile .
PM MAIL ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1319 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.