Saya selalu berpikir bahwa pemrograman fungsional dapat dilakukan dengan Python. Jadi, saya terkejut bahwa Python tidak banyak menyebutkan dalam pertanyaan ini , dan ketika disebutkan, biasanya tidak terlalu positif. Namun, tidak banyak alasan diberikan untuk ini (kurangnya pencocokan pola dan tipe data aljabar disebutkan). Jadi pertanyaan saya adalah: mengapa Python tidak bagus untuk pemrograman fungsional? Apakah ada lebih banyak alasan daripada kurangnya pencocokan pola dan tipe data aljabar? Atau apakah konsep-konsep ini begitu penting untuk pemrograman fungsional sehingga bahasa yang tidak mendukungnya hanya dapat digolongkan sebagai bahasa pemrograman fungsional tingkat kedua? (Perlu diingat bahwa pengalaman saya dengan pemrograman fungsional sangat terbatas.)
sumber
Jawaban:
Pertanyaan yang Anda referensi menanyakan bahasa mana yang mempromosikan OO dan pemrograman fungsional. Python tidak mempromosikan pemrograman fungsional walaupun ia bekerja dengan cukup baik.
Argumen terbaik melawan pemrograman fungsional dalam Python adalah bahwa kasus penggunaan imperatif / OO secara hati-hati dipertimbangkan oleh Guido, sementara case penggunaan pemrograman fungsional tidak. Ketika saya menulis Python imperatif, itu adalah salah satu bahasa tercantik yang saya tahu. Ketika saya menulis Python fungsional, itu menjadi jelek dan tidak menyenangkan seperti bahasa rata-rata Anda yang tidak memiliki BDFL .
Yang tidak berarti itu buruk, hanya saja Anda harus bekerja lebih keras daripada yang Anda lakukan jika Anda beralih ke bahasa yang mempromosikan pemrograman fungsional atau beralih ke penulisan OO Python.
Berikut ini hal-hal fungsional yang saya lewatkan di Python:
list
sekitar jika Anda ingin kegigihan. (Iterator digunakan sekali)sumber
Guido punya penjelasan bagus tentang ini di sini . Inilah bagian yang paling relevan:
Saya menarik dua hal dari ini:
sumber
Skema tidak memiliki tipe data aljabar atau pencocokan pola tetapi itu jelas merupakan bahasa fungsional. Mengganggu hal-hal tentang Python dari perspektif pemrograman fungsional:
Lambdas yang lumpuh. Karena Lambdas hanya dapat berisi ekspresi, dan Anda tidak dapat melakukan semuanya dengan mudah dalam konteks ekspresi, ini berarti bahwa fungsi yang dapat Anda tetapkan "on the fly" terbatas.
Jika adalah pernyataan, bukan ekspresi. Ini berarti, antara lain, Anda tidak dapat memiliki lambda dengan If di dalamnya. (Ini diperbaiki oleh terner di Python 2.5, tetapi terlihat jelek.)
Guido mengancam untuk menghapus peta, memfilter, dan mengurangi sesekali
Di sisi lain, python memiliki penutup leksikal, Lambdas, dan daftar pemahaman (yang benar-benar konsep "fungsional" apakah Guido mengakuinya atau tidak). Saya melakukan banyak pemrograman "fungsional-style" dengan Python, tapi saya hampir tidak mengatakan itu ideal.
sumber
Saya tidak akan pernah menyebut Python "fungsional" tetapi setiap kali saya memprogram di Python kode selalu berakhir menjadi hampir sepenuhnya fungsional.
Memang, itu terutama karena pemahaman daftar yang sangat bagus. Jadi saya tidak perlu menyarankan Python sebagai bahasa pemrograman fungsional tapi saya akan menyarankan pemrograman fungsional untuk siapa pun yang menggunakan Python.
sumber
Biarkan saya menunjukkan dengan sepotong kode yang diambil dari jawaban pertanyaan Python "fungsional" pada SO
Python:
Haskell:
Perbedaan utama di sini adalah bahwa perpustakaan standar Haskell memiliki fungsi yang berguna untuk pemrograman fungsional: dalam hal ini
iterate
,concat
dan(!!)
sumber
grandKids()
tubuh dengan ekspresi Generator:return reduce(lambda a, v: concat((x for x in kidsFunc(v)) for v in a), xrange(generation), [val])
.concat
:return reduce(lambda a, v: (x for v in a for x in kidsFunc(v)), xrange(generation), [val])
itertools.chain.from_iterable
Satu hal yang sangat penting untuk pertanyaan ini (dan jawabannya) adalah sebagai berikut: Apa sih pemrograman fungsional, dan apa sifat paling penting dari itu. Saya akan mencoba memberikan pandangan saya tentang itu:
Pemrograman fungsional sangat mirip menulis matematika di papan tulis. Saat Anda menulis persamaan di papan tulis, Anda tidak memikirkan perintah eksekusi. Tidak ada mutasi. Anda tidak kembali pada hari berikutnya dan melihatnya, dan ketika Anda membuat perhitungan lagi, Anda mendapatkan hasil yang berbeda (atau Anda mungkin, jika Anda memiliki kopi segar :)). Pada dasarnya, apa yang ada di papan tulis ada di sana, dan jawabannya sudah ada di sana ketika Anda mulai menuliskan sesuatu, Anda belum menyadari apa itu.
Pemrograman fungsional banyak seperti itu; Anda tidak mengubah banyak hal, Anda hanya mengevaluasi persamaan (atau dalam hal ini, "program") dan mencari tahu apa jawabannya. Program itu masih ada, tidak dimodifikasi. Sama dengan data.
Saya akan memberi peringkat berikut sebagai fitur paling penting dari pemrograman fungsional: a) transparansi referensial - jika Anda mengevaluasi pernyataan yang sama di waktu dan tempat lain, tetapi dengan nilai variabel yang sama, itu tetap berarti sama. b) tidak ada efek samping - tidak peduli berapa lama Anda menatap papan tulis, persamaan yang dilihat orang lain dengan papan tulis lain tidak akan berubah secara tidak sengaja. c) fungsi adalah nilai juga. yang dapat diteruskan dan diterapkan dengan, atau ke, variabel lain. d) komposisi fungsi, Anda dapat melakukan h = g · f dan dengan demikian mendefinisikan fungsi baru h (..) yang setara dengan memanggil g (f (..)).
Daftar ini dalam urutan prioritas saya, jadi transparansi referensial adalah yang paling penting, diikuti tanpa efek samping.
Sekarang, jika Anda membaca python dan memeriksa seberapa baik bahasa dan perpustakaan mendukung, dan menjamin, aspek-aspek ini - maka Anda berada di jalan yang baik untuk menjawab pertanyaan Anda sendiri.
sumber
Python hampir merupakan bahasa fungsional. Ini "fungsional lite".
Ini memiliki fitur tambahan, jadi itu tidak cukup murni untuk beberapa orang.
Itu juga tidak memiliki beberapa fitur, jadi itu tidak cukup lengkap untuk beberapa.
Fitur yang hilang relatif mudah untuk ditulis. Lihat pos seperti ini di FP dengan Python.
sumber
Alasan lain yang tidak disebutkan di atas adalah bahwa banyak fungsi built-in dan metode tipe built-in memodifikasi objek tetapi tidak mengembalikan objek yang dimodifikasi. Jika objek yang diubah dikembalikan, itu akan membuat kode fungsional lebih bersih dan lebih ringkas. Misalnya, jika some_list.append (some_object) mengembalikan some_list dengan some_object ditambahkan.
sumber
Selain jawaban lain, satu alasan Python dan sebagian besar bahasa multi-paradigma lainnya tidak cocok untuk pemrograman fungsional yang sebenarnya adalah karena kompiler / mesin virtual / run-times mereka tidak mendukung optimasi fungsional. Optimalisasi semacam ini dicapai oleh kompiler yang memahami aturan matematika. Sebagai contoh, banyak bahasa pemrograman mendukung
map
fungsi atau metode. Ini adalah fungsi yang cukup standar yang mengambil fungsi sebagai satu argumen dan iterable sebagai argumen kedua kemudian menerapkan fungsi itu untuk setiap elemen di iterable.Bagaimanapun ternyata itu
map( foo() , x ) * map( foo(), y )
sama denganmap( foo(), x * y )
. Kasus terakhir sebenarnya lebih cepat dari yang pertama karena yang pertama melakukan dua salinan di mana yang terakhir melakukan satu.Bahasa fungsional yang lebih baik mengenali hubungan berbasis matematis ini dan secara otomatis melakukan optimasi. Bahasa yang tidak didedikasikan untuk paradigma fungsional kemungkinan tidak akan optimal.
sumber
map( foo() , x ) * map( foo(), y ) == map( foo(), x * y )
tidak benar untuk semua fungsi. Sebagai contoh, pertimbangkan kasing ketikafoo
menghitung turunan.+
alih-alih*
.