Я в основному програміст C / C ++, а це означає, що більшість мого досвіду стосується процедурних та об'єктно-орієнтованих парадигм. Однак, як відомо багато програмістів на C ++, C ++ з роками перейшов до акцентів до функціонально-есківського стилю, що завершилося, нарешті, додаванням лямбда і закриттям в C ++ 0x.
Незважаючи на те, хоча я маю значний досвід кодування у функціональному стилі за допомогою C ++, у мене дуже мало досвіду з фактичними функціональними мовами, такими як Lisp, Haskell тощо.
Нещодавно я почав вивчати ці мови, тому що ідея "відсутність побічних ефектів" у суто функціональних мовах завжди мене заінтригувала, особливо що стосується її застосувань для одночасності та розподілу обчислень.
Однак, виходячи з фону C ++, я збентежений, як ця філософія "без побічних ефектів" працює з асинхронним програмуванням. Під асинхронним програмуванням я маю на увазі будь-який фреймворк / API / стиль кодування, який розсилає передбачені користувачем обробники подій для обробки подій, які відбуваються асинхронно (поза потоком програми). Це включає асинхронні бібліотеки, такі як Boost.ASIO, або навіть просто старий C обробники сигналів або обробники подій Java GUI.
Єдине, що усього цього спільного - це те, що, мабуть, характер асинхронного програмування вимагає створення побічних ефектів (стану) для того, щоб основний потік програми став зрозуміти, що викликається асинхронний обробник подій. Як правило, у такій структурі, як Boost.ASIO, обробник подій змінює стан об'єкта, так що ефект події поширюється поза межею функціонування обробника події. Дійсно, що ще може зробити обробник подій? Він не може "повернути" значення до точки виклику, оскільки немає точки дзвінка. Обробник подій не є частиною основного потоку програми, тому єдиний спосіб, який він може мати будь-який вплив на фактичну програму, - це змінити деякий стан (або інше longjmp
на інший пункт виконання).
Тож здається, що асинхронне програмування - це все про асинхронне створення побічних ефектів. Це, здається, повністю не входить в цілі функціонального програмування. Як ці парадигми узгоджуються (на практиці) з функціональними мовами?