![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
P.S. А вообще, вот интересная статейка о функциональном программировании на Python (если знаком с лиспом - должно понравиться
![]() -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
||||
|
||||
albertn |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Но по моему они зря сравнивают свои Короткозамкнутые функции с функцией COND. На сколько я понимаю,
Вернет совсем не 0, а 2. А для обхода этой ситуации придется толи менять условия, толи менять возвращаемое значение. А лисп это вещь, если конечно не это бесконечное количество скобок ![]() Добавлено @ 09:03
Че-то я забыл, что пустой список это тоже False |
||||||||||
|
|||||||||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
Спасибо, - пригодилось! |
|||
|
||||
Artemios |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Полной аналогии с COND наверно не получится:
будет 2, так как
Да, для аналогии с COND нужно, чтобы в мультиселекте в паре (a and b) второй элемент (возвращаемое значение b) никогда не был нулевым/пустым/ложным/etc, например:
вернет [0]. А это уже извращение ![]() ![]() Это сообщение отредактировал(а) Artemios - 24.8.2006, 19:23 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||||||||||
|
|||||||||||||
albertn |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
А также можно сделать, чтобы условия не пересикались, тогда результат будет аналогичным
Но это тоже не всегда удобно. Кстати, в случае чего можно написать свою функцию типа сишного ?:, как сделали в Zope, или даже саму функцию COND. Возможно даже это будет иметь смысл. |
||||
|
|||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Можно и весь лисп прикрутить в качестве расширяемого модуля ![]() ![]() -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
albertn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Ну если так посмотреть, то в питоне есть почти все, что необходимо для лиспа. Ну че, организуем проект? |
|||
|
||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
тогда лучше создать отдельную тему в форуме.
я - за! Но знаний по лиспу нет. |
|||
|
||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Эх, оффтопик, но для отдельной темы наверно это пока будет излишне...
У меня по лиспу тоже мало знаний. Есть такие соображения. Если нам нужен чистый функциональный лисп (без ОО), то здесь вообще проблем не должно быть. Единственное, что потребуется - реализовать на си преобразование: питоновский список <--> лисповский список. Другой вопрос: а нужно ли это? То же самое со списками мы можем и питоном делать. Как в лиспе программа - это такой же список, как и данные, - так и в питоне программа - это такой же объект, как и другие объекты. То есть, если нам нужны не только преобразования списочных данных, но и динамическая генерация/модификация программного кода - то это позволяет и питон (функции высших порядков, метаклассы). Такое вот ИМХО ![]() -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
предлагаю написать функции, которые эмулировали работу со списками или написать класс потомок списка и класс потомок словаря, у которых были бы специфические методы и свойства. |
|||
|
||||
Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
||||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 10 Всего: 173 |
Почти в тему
![]() Набрёл случайно по ссылкам на следующий ASPN Cookbook recipe: List/Generator Monad Combinators. Отрывок кода:
Отдавая должное изобретательности автора этого кода, лично у меня возникают ассоциации с шаблонным метапрограммированием в С++: выглядит круто, но на практике проще пользоваться языками и инструментами, изначально ориентированными на такой род задач. Могу ошибаться ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
setq |
|
|||
Unregistered |
||||
|
||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
Cr@$h, спасибо!
|
|||
|
||||
Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
||||
|
||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Ну тогда вот продолжения того же автора: http://www.citforum.ru/programming/python/python8.shtml http://www.citforum.ru/programming/python/python9.shtml В этих двух статьях он рассматривает специфический модуль для ФП. Модуль достаточно древний, 2001 г., но интересный, наверно не потребуется и этого: 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) ] |
|||
|
||||
Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
||||
|
||||
Artemios |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
albertn, прости, сразу невнимательно смотрел, пропустил. Твой пример возвращает False по первому элементу последней пары, а по логике COND первые элементы вообще невозвращаются, нам был нужен 0 по второму элементу второй пары. -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||
|
|||||
setq |
|
|||
Unregistered |
Artemios, генераторные включения есть в 2.4
|
|||
|
||||
Artemios |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
О как! Спасибо огромнейшее, не забуду. Или кто-нибудь плз ++setq. -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||
|
|||||
Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
||||
|
||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
из: http://forum.vingrad.ru/index.php?showtopi...st&p=838866
Так это вроде бы и не функции - методы класса list ... -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
albertn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Многие функции функционального программирования реализуются через методы класса list. Ведь не все же функции, имеющиеся в этом классе реализованы как отдельные функции, поэтому я говорю, что они реализованы как чисто императивные. |
|||
|
||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
albertn, прости пожалуста, я наверно тебя не очень понимаю, так как не очень хорошо знаком с ФП.
Как я понимаю ФП, это суперпозиция функций первого и более высших порядков от списочных аргументов, в идеале функции неимеют побочных эффектов. А в ООП - нечто противоположное - методы объекта - для работы с данными объекта и их изменения, то есть все и завязано на побочных эффектах методов, если их рассматривать как функции от объектов. То есть, для достижения функциональности, как мне кажется, должна быть некоторая внутренне императивная обертка вроде:
Это сообщение отредактировал(а) Artemios - 1.9.2006, 11:37 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
albertn |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Ты все верно понимаешь. Если бы в Python эти функции были реализованы, то тогда о нем можно было-бы говорить как о ФП. А так в нем есть только включения, упрощающие функционального программирования. Конечно можно дописать эти недостоющие функции, но дописать их можно и в любом другом языке без особых проблем. А про побочные действия это ты зря. Там скорее не про побочные действия, а про то, что никакая функция не должна изменять переданные ей аргументы, а возвращать новый измененный аргумент. |
||||
|
|||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 10 Всего: 173 |
Второе есть необходимое, но не достаточное условие первого. Давайте разделять понятия: Питон позволяет писать в функциональном стиле, поскольку функции в нём являются первоклассными объектами, есть замыкания и функции высшего порядка. Питон не является чисто функциональным языком, поскольку не только позволяет побочные эффекты, но и не препятствует им. До звания функционального языка он, на мой взгляд, не дотягивает из-за отсутствия оптимизации хвостовой рекурсии (я тут приводил пример, как её реализовать с помощью декораторов, но это хак и притом медленный хак). -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Нашел там же еще примерчики: Tail Recursion Decorator Tail Call Optimization Decorator Это сообщение отредактировал(а) Artemios - 2.9.2006, 00:52 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
А вот еще карринг:
http://aspn.activestate.com/ASPN/Cookbook/...n/Recipe/222061 http://aspn.activestate.com/ASPN/Cookbook/...on/Recipe/52549 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
Artemios |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
С питона 2.4, оказывается есть и функциональные аналоги: sorted, reversed:
Тихо сам с собою я веду беседу, не мешайте разговаривать с умным человеком ![]() Это сообщение отредактировал(а) Artemios - 4.9.2006, 16:30 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||||
|
|||||||
Cr@$h |
|
||||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Здорово. Я же говорил очевидную вещь
Так что теперь
а
Ну, по этим двум зачот. А что осталось собственно? Tail recursion и чистота функций, как минимум. Кстати, про хвостовую рекурсию. Компилятор/интерпретатор делает оптимизацию прозрачно, да? В некоторых языках давно есть, посмотрите в Python. Artemios, а сам с собой говорить не стоит -- первый признак шизофрении. ![]() ![]() |
||||||
|
|||||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |