Как я могу использовать функциональное программирование в реальном мире? [закрыто]


103

Функциональные языки хороши тем, что они избегают ошибок, устраняя состояние, а также тем, что их можно легко распараллелить автоматически, не беспокоясь о количестве потоков.

Однако, как разработчик Win32, могу ли я использовать Haskell для некоторых dll моего приложения? И если я это сделаю, есть ли какое-то реальное преимущество, которое я автоматически воспользуюсь? Если да, то что дает мне это преимущество, компилятор?

Распараллеливает ли F # функции, которые вы пишете для нескольких ядер и процессоров, автоматически для вас? Вы когда-нибудь заметили, что количество потоков в диспетчере задач увеличится?

В основном мой вопрос: как я могу начать использовать Haskell на практике, и действительно ли я увижу какие-то преимущества, если это сделаю?


2
Лично я бы посмотрел на erlang - но это я.
Джейсон Бантинг,

2
Чтобы немного уточнить, у меня уже есть опыт работы с несколькими разными языками функционального программирования, и я знаю, как они работают и в чем их различия. Но это конкретный вопрос: как мне использовать это в реальных условиях.
Брайан Р. Бонди,

1
возможный дубликат Почему функциональные языки?

Ответы:


41

Похоже, книга Real World Haskell - это именно то, что вы ищете. Вы можете прочитать это бесплатно онлайн:

http://book.realworldhaskell.org/


Я жду, когда его напечатают. Кажется, это будет одна из лучших книг в мире. Бьюсь об заклад, он будет обслуживать людей, интересующихся Haskell лучше, чем Practical Ocaml для Ocaml
Фридрих

25

F # не содержит волшебной пыли пикси, которая передала бы функции другим процессорам или машинам. Что делают F # / Haskell и другие языки функционального программирования, так это упрощают вам написание функций, которые могут обрабатываться независимо от потока или процессора, на котором они были созданы.

Мне кажется неправильным размещать здесь ссылку на подкаст, в котором я участвую, это кажется немного неуместным, но в эпизоде ​​«Кодекс пастушества», где мы говорили с Мэттом Подвизоцким, мы задали тот же вопрос, и он дал несколько интересных ответов. В этом эпизоде ​​также есть много хороших ссылок, касающихся функционального программирования. Я нашел одну ссылку, озаглавленную « Почему так важно функциональное программирование », которая может дать вам некоторые ответы.




14

Это также может быть интересно: « Функциональное программирование в реальном мире »

Примеры есть на F # и C #, но теория довольно общая. Из того, что я прочитал (предварительный выпуск), это определенно интересно, но пока я думаю, что это заставляет меня все больше и больше придерживаться C #, используя библиотеки, такие как Parallel Extensions.


Вы все еще чувствуете, что «хотите все больше и больше придерживаться C #»? F # предлагает несколько интересных функций. Самый большой импульс, который я получил, - это меньше набирать текст (что означает меньшее трение в процессе выражения решений в коде).
Daniel

1
@Daniel в некотором роде, тем более; p Инструменты, над которыми я работаю, могут быть нетипичными.
Marc Gravell

8

Вы не упомянули, но я предполагаю, что вы используете C ++. Один потенциально простой способ войти в функционал - это перейти от C ++ / CLI к F #. C ++ содержит «волшебную пыльцу пикси» (называемую IJW: It Just Works), позволяющую вызывать и отключать управляемый код. При этом вызывать код F # почти так же просто, как и из C #.

Я использовал это в одной программе (FreeSWITCH), которая полностью написана на C / C ++. С помощью единого управляемого C ++ / CLI (используйте переключатель / clr) он волшебным образом переходит в управляемый код, и оттуда я могу загрузить свои плагины F # и выполнить их. Чтобы упростить развертывание, F # может статически связывать все свои зависимости, поэтому вам не нужно развертывать файлы времени выполнения F #. Еще одна вещь, которая делает код CLR привлекательным, заключается в том, что вы можете передавать управляемый код (делегаты) в код C, и среда выполнения автоматически делает за вас преобразование.

Если вы решите пойти по пути Haskell, вам понадобится функция FFI: Foreign Function Interface. Однако я не думаю, что это даст вам такой же уровень интеграции, как C ++ / CLI с F #.


6

В настоящее время я сам изучаю Haskell, когда вы начинаете его изучать, это не кажется очень интригующим, потому что опыт обучения НИЧЕГО не похож на изучение языка, такого как C #, это совершенно новый мир, но я заметил, что могу писать очень, очень сложно выражений всего в нескольких строках кода, когда я снова посмотрел на код, он был гораздо более кратким, маленьким и плотным. Мне это очень нравится! Вы действительно можете писать реальные программы, которые будут меньше, проще в обслуживании и намного сложнее, чем позволяет большинство других языков, я голосую за вас, чтобы вы их изучили !!

Удачи.


4

Поскольку вы упомянули Win32 и библиотеки DLL, я предполагаю, что вы работаете с неуправляемым кодом. В этом случае вам подойдет GHC. В конце прошлого года я написал сервер DDE под Windows, используя FFI для общения с библиотеками MS DDE, и, что удивительно, это был чрезвычайно приятный опыт (особенно с учетом того, что я парень Unix). FFI Haskell является мощным (даже поддерживает, например, обратные вызовы функций Haskell из C или других библиотек), а проверка типов в Haskell при написании кода уровня C - это как сбывшаяся мечта.

Последний пункт - одно из главных преимуществ Haskell: система типов потрясающая. Тем не менее, это как любой мощный инструмент; ему нужно время и усилия, чтобы эффективно его использовать.

Итак, да, можно начать с написания небольших фрагментов кода на Haskell, которые связаны с остальной частью вашего кода (хотя вам может быть проще начать с небольших программ Haskell, которые ссылаются на ваш другой код), и это стоит потратить достаточно времени, чтобы узнать об этом и использовать его везде, где только возможно. Вы можете в конечном итоге, как и я, спланировать довольно крупный проект, тесно интегрированный с кодом Windows (в моем случае, сложную надстройку Excel) на Haskell.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.