![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
sandello |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 18.5.2005 Где: Пермь Репутация: нет Всего: 2 |
Пытаюсь освоить функциональное программирование на питоне.
Попытался построчно считать файл в список. Час убил, не могу понять как это сделать. В рамках императивной парадигмы я бы сделал так:
Как это же изобразить с помощью функционального подхода - ума не приложу. PS я знаю про метод f.readlines() ![]() Добавлено @ 11:25 Максимум до чего смог додуматься:
Но хочется обойтись вообще без внутренней переменной. Это сообщение отредактировал(а) sandello - 23.5.2008, 11:26 -------------------- ![]() |
||||
|
|||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 10 Всего: 173 |
Питон не настолько заточен под функциональную парадигму, чтобы это упражнение имело какой-то смысл. К тому же, ввод-вывод подразумевают побочные эффекты, и в Питоне нет никаких средств для их изоляции. Не монады же лепить, в самом деле. Такой код в «грязном» функциональном языке, вроде ML, отличался бы только заменой цикла и append на рекурсивную функцию и cons. В Питоне нет ни оптимизации хвостовой рекурсии, ни эффективных неизменяемых списков, так что и этот вариант является бессмысленным.
Подводя черту: file.readlines — это и есть самый «функциональный» способ решения данной задачи, и не надо придумывать искусственные проблемы. Прелесть Питона в том, что first class functions, closures, list comprehensions и пр. дополняются возможностями предельно динамического языка. Это не классическое ФП, но по своему не менее выразительный подход. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
sandello |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 18.5.2005 Где: Пермь Репутация: нет Всего: 2 |
Цель решения данной задачи - научиться. Мне наплевать на оптимизацию рекурсии сейчас
![]() В догонку вопрос: какой язык лучше тогда использовать для написания рабочих программ в рамках фунциональной парадигмы? -------------------- ![]() |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 10 Всего: 173 |
Рабочих — это каких? Для какой цели? :-) Квинтэссенция и передовой край современной функциональщины — это пожалуй всё-таки Haskell. Достаточно продвинутые теоретически и одновременно приближенные к современном окружению: Scala (JVM) и Nemerle (.NET). Смешанная парадигма + статическая типизация + приличные компиляторы = ML-оиды (OCaml, SML). Динамика, параллелизм и отказоустойчивость — Erlang. Ну и Лисп особняком. У которого функциональная парадигма — тоже одна из. Остальное, пожалуй, стоит рассматривать только с теоретической точки зрения. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
sandello |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 18.5.2005 Где: Пермь Репутация: нет Всего: 2 |
Думаю до хаскела или erlang'а тоже доберусь... После того, как чуть-чуть научусь.
Экспериментировать начал на питоне т.к. немного его знаю ![]() Еще вопрос в рамках той же парадигмы. Есть список:
Нужно из него составить словарь
Как? Это сообщение отредактировал(а) sandello - 23.5.2008, 19:25 -------------------- ![]() |
||||
|
|||||
sandello |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 18.5.2005 Где: Пермь Репутация: нет Всего: 2 |
Сделал так:
Ни как не могу сделать лямбда-функцию, добавляющую новую пару с словарь, в одну строку что-то вроде
По уму эта функция должна возвращать x, но как это сделать я пока не понял Это сообщение отредактировал(а) sandello - 23.5.2008, 20:16 -------------------- ![]() |
||||
|
|||||
Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 10 Всего: 173 |
Повторюсь, в Питоне очень туго с недеструктивными операциями, и стандартные типы данных на них никак не заточены. Единственным «функциональным» средством можно считать list comprehensions и generator expression, со всеми вытекающими.
Ну возьмём эту задачу. Если решать императивно, получится вот такое:
Вариант на генераторах может выглядеть так:
Только вот сложность уже квадратичная от длины списка, и вряд ли это можно исправить, не прибегая к императивным конструкциям. В общем, Питон слабо подходит для освоения ФП. Хотя лямбды, функции высшего порядка и т.п. могут произвести впечатление при переходе с языка, где их нет. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
sandello |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 18.5.2005 Где: Пермь Репутация: нет Всего: 2 |
Мда...
Ну хоть лямбду более-менее освоил с помощью питона и то вперед ![]() В Java её нет в явном виде. -------------------- ![]() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |