Saya kebanyakan adalah seorang programmer C / C ++, yang berarti bahwa mayoritas pengalaman saya adalah dengan paradigma prosedural dan berorientasi objek. Namun, seperti yang diketahui oleh banyak programmer C ++, C ++ telah bergeser dalam penekanan selama bertahun-tahun ke gaya fungsional-esque, yang akhirnya memuncak dengan penambahan lambdas dan penutupan di C ++ 0x.
Bagaimanapun juga, walaupun saya memiliki banyak pengalaman pengkodean dalam gaya fungsional menggunakan C ++, saya memiliki sedikit pengalaman dengan bahasa fungsional aktual seperti Lisp, Haskell, dll.
Saya baru-baru ini mulai mempelajari bahasa-bahasa ini, karena gagasan "tidak ada efek samping" dalam bahasa yang murni fungsional selalu menggelitik saya, terutama yang berkaitan dengan penerapannya pada konkurensi dan komputasi terdistribusi.
Namun, berasal dari latar belakang C ++ saya bingung bagaimana ini "tidak ada efek samping" bekerja dengan pemrograman asinkron. Dengan pemrograman asinkron, yang saya maksudkan adalah kerangka / API / gaya pengkodean yang mengirim pengendali event yang disediakan pengguna untuk menangani peristiwa yang terjadi secara tidak sinkron (di luar alur program.) Ini termasuk pustaka asinkron seperti Boost.ASIO, atau bahkan C biasa saja penangan sinyal atau penangan event Java GUI.
Satu hal yang sama-sama dimiliki oleh semua adalah bahwa sifat pemrograman asinkron tampaknya membutuhkan penciptaan efek samping (keadaan), agar aliran utama program menjadi sadar bahwa event handler asinkron telah dijalankan. Biasanya, dalam kerangka kerja seperti Boost.ASIO, pengendali acara mengubah keadaan suatu objek, sehingga efek dari acara tersebut diperbanyak di luar masa pakai fungsi event handler. Sungguh, apa lagi yang bisa dilakukan oleh seorang pawang? Itu tidak dapat "mengembalikan" nilai ke titik panggilan, karena tidak ada titik panggilan. Event handler bukan bagian dari aliran utama program, jadi satu-satunya cara ia dapat memiliki efek pada program yang sebenarnya adalah mengubah beberapa status (atau yang lain longjmp
ke titik eksekusi lain).
Jadi tampaknya pemrograman asinkronik adalah tentang efek samping yang tidak sinkron. Ini tampaknya sangat bertentangan dengan tujuan pemrograman fungsional. Bagaimana kedua paradigma ini direkonsiliasi (dalam praktiknya) dalam bahasa fungsional?