Мне кажется,
я знаю ответ на вопрос, почему функциональное
программирование никак не расцветет в
ширнармассах. Казалось бы, такая
прекрасная вещь – программы в
функциональном стиле, предсказуемые,
безопасные, легко тестируемые. Ан нет.
Никак. Почему?
Ну, вынося за
скобки вопросы быстродействия и
требований к ресурсам, я думаю, проблема
в том, что для успешного применения
функционального подхода надо изрядно
вывернуть мозги. Человеки с детства
приучаются рассуждать и мыслить в
императивном стиле. И вдруг, раз, на
тебе, надо стиль мышления перестраивать.
Не все готовы. А те, кто готов, не все
могут. Чтобы в этом убедиться, достаточно
взять любой учебник по 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


Комментариев нет:
Отправить комментарий