Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2015-05-25

Lambda calculus

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

Комментариев нет:

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

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)