Bahasa fungsional, menurut definisi, seharusnya tidak mempertahankan variabel status. Lalu, mengapa Haskell, Clojure, dan lainnya menyediakan implementasi perangkat lunak memori transaksional (STM)? Apakah ada konflik antara dua pendekatan?
functional-programming
haskell
clojure
stm
Michael Spector
sumber
sumber
Jawaban:
Tidak ada yang salah dengan bahasa fungsional yang mempertahankan status bisa berubah. Bahkan bahasa fungsional "murni" seperti Haskell perlu mempertahankan status untuk berinteraksi dengan dunia nyata. Bahasa fungsional "Najis" seperti Clojure memungkinkan efek samping yang dapat mencakup keadaan bermutasi.
Poin utamanya adalah bahwa bahasa-bahasa fungsional mencegah negara yang tidak bisa berubah kecuali Anda benar-benar membutuhkannya . Gaya umum adalah memprogram menggunakan fungsi murni dan data yang tidak dapat diubah, dan hanya berinteraksi dengan keadaan tidak berubah yang "tidak murni" di bagian spesifik kode Anda yang memerlukannya. Dengan begitu, Anda dapat menjaga sisa basis kode Anda "murni".
Saya pikir ada beberapa alasan mengapa STM lebih umum dalam bahasa fungsional:
Saya pribadi menyukai pendekatan Clojure yang memungkinkan mutabilitas, tetapi hanya dalam konteks "referensi terkelola" yang dikendalikan secara ketat yang dapat berpartisipasi dalam transaksi STM. Segala hal lain dalam bahasa ini "murni fungsional".
Perhatikan bahwa kode di atas sepenuhnya transaksional dan atomik - pengamat eksternal yang membaca dua saldo dalam transaksi lain akan selalu melihat keadaan atom yang konsisten, yaitu dua saldo akan selalu berjumlah 200. Dengan konkurensi berbasis kunci, ini merupakan masalah yang sangat sulit. untuk menyelesaikan dalam sistem kompleks besar dengan banyak entitas transaksional.
Untuk beberapa pencerahan tambahan, Rich Hickey melakukan pekerjaan yang sangat baik untuk menjelaskan STM Clojure dalam video ini
sumber
Definisi Anda salah. Bahasa yang tidak dapat mempertahankan status tidak bisa digunakan.
Perbedaan antara bahasa fungsional dan imperatif bukanlah bahwa salah satu dari mereka memiliki negara dan yang lainnya tidak. Dengan cara mereka mempertahankan negara.
Bahasa imperatif memiliki status penyebaran di seluruh program.
Bahasa fungsional mengisolasi dan mempertahankan status secara eksplisit melalui tanda tangan jenis. Dan itulah alasan mereka menyediakan mekanisme manajemen negara yang canggih seperti STM.
sumber
Terkadang suatu program membutuhkan keadaan yang bisa berubah-ubah (misalnya, isi basis data untuk aplikasi web) dan akan bagus untuk dapat menggunakannya tanpa kehilangan manfaat pemrograman fungsional. Dalam bahasa non-fungsional, keadaan yang bisa berubah merasuki segalanya. Jika Anda membuatnya eksplisit dengan semacam API khusus , maka Anda dapat membatasinya ke wilayah kecil yang dapat diidentifikasi sementara yang lainnya tetap berfungsi murni. Manfaat FP termasuk debugging yang lebih mudah, pengujian unit berulang, konkurensi tanpa rasa sakit, dan keramahan multicore / GPU.
sumber