О функциональном программировании
20-06-2009 02:31
к комментариям - к полной версии
- понравилось!
Полезно понимать внутренности работы любой системы. Некоторые сокращают этот тезис до того, что полезно работать в машинных кодах, а остальное не труЪ, но это передёргивание.
Я люблю Haskell. Это даже не язык. Это средство для вправления мозгов и выражения мыслей. На нём неудобно писать взаимодействие в СУБД или формочки для гуёв. Но на нём удобно плавно входить в понятие лямбда-исчисления, писать парсеры сложных грамматик, писать нечёткую логику и мозги для огромных боевых человекоподобных роботов. После того, как я написал парсер математических выражений и программу численного интегрирования распарсенного выражения, я уже не могу мыслить так, как мыслил до этого.
Но в хаскеле интересна не только его внешняя сторона, внутренности тоже. Вот например. Все говорят, что в хаскеле есть частичное применение функций. Написали add a b = a + b, написали inc = add 1 и получили новое имя для частично применённой функции add. Однако, на канувшем в лету ещё том дваче (бложик закрытый, ракую сколько хочу, всё шикарно!) был разговор о том, что ничего подобного там нет. В самом деле: add a b = a + b — ведь это просто синтаксический сахар для записи add = (\a b -> a +b), которая, в свою очередь, является сахаром для записи (\a -> (\b ->a + b)). Вау, замыкая рулят и педалят. Теперь вспомним, что функции в хаскеле являются объектами первого класса. Получится, что запись add 1 эквивалентна (\a -> (\b ->a + b)) 1. Воспользуемся бета-редукцией и упростим терм. Получится (\с ->1 + с)). Бинго! А за счёт первого класса функций мы в рантайме создаём новую. Так что, никакого частичного применения функций.
К чему это я. Так вот. Мне в последнее время очень нравится Python. Он краток и лаконичен, это язык для программиста. И пусть адепты статической типизации и дальше сидят, перекладывая байтики, и даже не представляя, что динамическая типизация — это ведь почти то же автоматическое выведение типов в хаскеле. А хаскель — это лучшая концепция в наше время. Не лучший язык, но концепция божественна.
Python поддерживает частичное применение функций через модуль fucntional. Но он не является частью стандартной библиотеки. И тут я вспоминаю хаскель. О-па! Вот есть у нас функция f(x, y). Нужна нам возможность её частично применять. Придумал: f1 = (lambda x: lambda y: f(x, y)). И да — всё работает! f1(1)(2), f2 = f1(3) — всё как в любимом хаскеле.
Ведь строить абстракции — это не так сложно, достаточно знать, как они построены в других местах.
вверх^
к полной версии
понравилось!
в evernote