Как я могу использовать функциональное программирование в реальном мире?
Функциональные языки хороши тем, что избегают ошибок, устраняя состояние, а также потому, что они могут быть легко распараллелены для вас автоматически, без необходимости беспокоиться о количестве потоков.
Как разработчик Win32, могу ли я использовать Haskell для некоторых библиотек моего приложения? И если я это сделаю, есть ли реальное преимущество, которое будет использовано для меня автоматически? Если так, что дает мне это преимущество, компилятор?
Выполняет ли F# параллелизацию функций, которые вы пишете для нескольких ядер и процессоров, автоматически для вас? Вы когда-нибудь увидели бы увеличение количества потоков в диспетчере задач?
По сути, мой вопрос: как я могу начать использовать Haskell на практике, и получу ли я какие-то преимущества, если я это сделаю?
6 ответов
Кажется, что книга Real World Haskell - это то, что вы ищете. Вы можете прочитать это бесплатно онлайн:
F# не содержит никакой волшебной пыли, которая передает функции различным процессорам или машинам. Что делает F#/Haskell и другие функциональные языки программирования, так это упрощает написание функций, которые могут обрабатываться независимо от потока или процессора, на котором они были созданы.
Я не считаю правильным размещать здесь ссылку на подкаст, в котором я участвую, кажется немного странным, но в эпизоде "Стадного кодекса", где мы разговаривали с Мэттом Подвыски, мы задали тот же вопрос, и он дал несколько интересных ответов. В этом эпизоде также есть много хороших ссылок, касающихся функционального программирования. Я нашел одну ссылку с заголовком " Почему функциональное программирование имеет значение", которая может дать некоторые ответы для вас.
Это также может быть интересно: " Функциональное программирование в реальном мире"
Примеры в F# и C#, но теория довольно общая. Из того, что я прочитал (предварительная версия), это определенно интересно, но пока я думаю, что это заставляет меня хотеть все больше и больше придерживаться C#, используя библиотеки, такие как Parallel Extensions.
Вы не упомянули, но я предполагаю, что вы используете C++. Один из потенциально простых способов попасть в функционал - это использовать C++/CLI для F#. C++ содержит "волшебную пыль" (называемую IJW: It Just Works), позволяющую вам входить и выходить из управляемого кода. При этом вызов кода F# почти так же прост, как и из C#.
Я использовал это в одной программе (FreeSWITCH), которая полностью написана на C/C++. С одним управляемым C++/CLI (используйте ключ /clr) он волшебным образом переходит в управляемый код, и оттуда я могу загрузить свои плагины F# и выполнить их. Чтобы упростить развертывание, F# может статически связывать все свои зависимости, поэтому вам не нужно развертывать файлы среды выполнения F#. Еще одна вещь, которая делает код CLR привлекательным, заключается в том, что вы можете передавать управляемый код (делегаты) в код C, и среда выполнения автоматически создает для вас эффект.
Если вы решите пойти по пути Haskell, вам понадобится функция FFI: Интерфейс внешних функций. Однако я не думаю, что это даст вам тот же уровень интеграции, что и C++/CLI с F#.
В настоящее время я изучаю Haskell сам, когда вы начинаете изучать его, это не кажется очень интригующим, потому что опыт обучения НИЧЕГО не похож на изучение языка, такого как C#, это совершенно новый мир, но я заметил, что могу писать очень и очень сложный выражения в несколько строк кода, когда я оглянулся на код, он был гораздо более кратким, он был маленьким и сжатым. Я абсолютно люблю это! Вы действительно можете писать реальные программы, которые будут меньше, проще в обслуживании и намного сложнее, чем позволяет большинство других языков, я голосую за то, чтобы вы выучили это!!
Удачи.
Поскольку вы упоминаете Win32 и библиотеки DLL, я предполагаю, что вы работаете с неуправляемым кодом. В этом случае GHC будет работать очень хорошо для вас. В конце прошлого года я написал сервер DDE под Windows, используя FFI для общения с библиотеками MS DDE, и, что удивительно, это было чрезвычайно приятно (особенно если учесть, что я парень из Unix). FFI Haskell является мощным (даже поддерживает, например, обратные вызовы в функции Haskell из C или других библиотек), и проверка типа Haskell при написании кода на уровне C- это как воплощение мечты.
Этот последний момент является одним из главных преимуществ Haskell: система типов удивительна. Тем не менее, это как любой мощный инструмент; это требует времени и усилий, чтобы эффективно использовать это.
Так что да, можно начать писать небольшие кусочки кода на Haskell, которые ссылаются на остальную часть вашего кода (хотя вам может быть легче начать с небольших программ на Haskell, которые ссылаются на ваш другой код), и это стоит потратить достаточно много времени, чтобы узнать об этом и использовать его, где вы можете. В конечном итоге вы, как и я, можете планировать довольно крупный проект, тесно интегрированный с кодом Windows (в моем случае, сложной надстройкой Excel) в Haskell.