Мне кажется,
я знаю ответ на вопрос, почему функциональное
программирование никак не расцветет в
ширнармассах. Казалось бы, такая
прекрасная вещь – программы в
функциональном стиле, предсказуемые,
безопасные, легко тестируемые. Ан нет.
Никак. Почему?
Ну, вынося за
скобки вопросы быстродействия и
требований к ресурсам, я думаю, проблема
в том, что для успешного применения
функционального подхода надо изрядно
вывернуть мозги. Человеки с детства
приучаются рассуждать и мыслить в
императивном стиле. И вдруг, раз, на
тебе, надо стиль мышления перестраивать.
Не все готовы. А те, кто готов, не все
могут. Чтобы в этом убедиться, достаточно
взять любой учебник по Lisp (не говоря уже
о более современных реализациях
концепции) и начать смотреть примеры
кода. К 10 странице мозги неподготовленного
программера начнут плавиться. Если нет,
поздравляю, вы кандидат в элитные войска
бойцов клавиатурного фронта.
Вот пример,
для иллюстрации, из статьи, рассчитанной
на обычного, среднего программиста (код
я слегка переформатировал):
bands = [ {'name': 'sunset rubdown', 'country': 'UK', 'active': False}, {'name': 'women', 'country': 'Germany', 'active': False}, {'name': 'a silver mt. zion', 'country': 'Spain', 'active': True} ] def assoc(_d, key, value): from copy import deepcopy d = deepcopy(_d) d[key] = value return d def call(fn, key): def apply_fn(record): return assoc(record, key, fn(record.get(key))) return apply_fn def pipeline_each(data, fns): return reduce( lambda a, x: map(x, a), fns, data ) print pipeline_each( bands, [ call(lambda x: 'Canada', 'country'), call(lambda x: x.replace('.', ''), 'name'), call(str.title, 'name') ] ) |
А теперь
скажите, сколько времени надо этому
среднему программеру на то, чтобы понять,
что тут написано, как оно работает и что
оно делает? Что будет выведено на консоль?
А сколько
времени надо, чтобы самому это написать?
А теперь
посмотрите, как выглядит код, который
напишут 146% программеров для решения
задачи:
def format_bands(bands): for band in bands: band['country'] = 'Canada' band['name'] = band['name'].replace('.', '') band['name'] = band['name'].title() |
И скажите,
положа руку на сердце, какой код понятнее
и проще?
Но, как уже
было упомянуто, функциональное
программирование дает нам такие
фундаментальные ценности, как
предсказуемость и безопасность. Для
больших и серъезных проектов это не
просто важно а архиважно. Поэтому интерес
к функциональщине не ослабевает. А с
ростом вычислительных ресурсов даже
растет. Ибо проблемы быстродействия и
потреблядства мощностей перестают быть
шоустоппером.
А посему,
несколько интересных материалов для
самостоятельного изучения:
Функционально
на Python
Рассуждая о
функциональном программировании, люди
часто начинают выдавать кучу
«функциональных» характеристик. ...
Забейте.
Функциональный код отличается одним
свойством: отсутствием побочных
эффектов. Он не полагается на данные
вне текущей функции, и не меняет данные,
находящиеся вне функции. Все остальные
«свойства» можно вывести из этого.
Будни
преподавателя
студенты
зажигают
Дал им
"дополнительную домашку" - выразить
next succ в лямбде через комбинаторы.
Вот их ответ:
S(K (S ( S(KS) (
S(KK)I ) ) )) ( S ( S (KS) ( S(K(S(KS))) ( S ( KS)( S(KK)( S(KS)(
S(KK)I) ))) (K (S(KK)I )))) ) (K (KI) ) )
Чтобы было
понятнее, о чем это у ivan-gandhi, смотрите
сюда:
Scala implementation of
a lambda calculus interpreter
Lambda calculus
(also written as λ-calculus) is a formal system in mathematical
logic for expressing computation based on function abstraction and
application using variable binding and substitution.
…
Counterparts to
lambda calculus in computer science are functional programming
languages, which essentially implement the lambda calculus (augmented
with some constants and datatypes)
Combinatory logic is
a notation to eliminate the need for quantified variables in
mathematical logic. It was introduced by Moses Schonfinkel and
Haskell Curry, and has more recently been used in computer science as
a theoretical model of computation and also as a basis for the design
of functional programming languages. It is based on combinators. A
combinator is a higher-order function that uses only function
application and earlier defined combinators to define a result from
its arguments
CombLogic
This project is a
combinatory logic playground
original post http://vasnake.blogspot.com/2015/05/lambda-calculus.html
Комментариев нет:
Отправить комментарий