StackOverflow menunjuk saya ke sini, jadi pertanyaannya mungkin sedikit dalam istilah awam.
Wikipedia mendefinisikan fungsi murni sebagai
Dalam pemrograman komputer, suatu fungsi dapat digambarkan sebagai fungsi murni jika kedua pernyataan ini tentang fungsi tersebut:
- Fungsi selalu mengevaluasi nilai hasil yang sama dengan nilai argumen yang sama. Nilai hasil fungsi tidak dapat bergantung pada informasi atau keadaan tersembunyi yang dapat berubah saat eksekusi program berlangsung atau antara berbagai eksekusi program, juga tidak dapat bergantung pada input eksternal dari perangkat I / O.
- Evaluasi hasil tidak menyebabkan efek samping atau keluaran yang dapat diamati secara semantik, seperti mutasi objek yang dapat berubah atau keluaran ke perangkat I / O.
Namun tampaknya tidak mengutip sumber apa pun - sehingga sulit untuk mengatakan apakah ini merupakan definisi yang diterima, atau siapa yang mendefinisikannya dengan cara ini.
Ketika saya melihat apa yang dilakukan bahasa ketika mereka menyertakan sintaks / anotasi untuk fungsi "murni", ada beberapa pendekatan yang berbeda:
- Di D , satu-satunya batasan adalah non-mutasi negara global. Fungsi "Murni" dapat mengubah argumennya.
- Dalam GCC ada dua jenis "murni":
pure
(tidak ada efek samping, tetapi dapat membaca keadaan global) danconst
(sangat murni sesuai definisi wikipedia). - Dalam C # , itu didefinisikan sebagai "tidak membuat perubahan status yang terlihat" (apa pun itu).
- Haskell mengikuti definisi Wikipedia.
Jadi pertanyaan saya adalah: adakah definisi kanonik fungsi murni?
Dan jika ada, apa sumbernya?
terminology
functional-programming
semantics
Andrey Shchekin
sumber
sumber
Jawaban:
Sebagaimana dicatat dalam makalah ini Imperative Functional Programming , (1993) oleh Peyton-Jones dan Wadler (di antara kelompok peneliti yang menciptakan Haskell):
fokusnya adalah tidak adanya efek samping untuk memungkinkan transformasi program (yaitu optimisasi kompiler).
Apa efek sampingnya? Makalah ini pada gilirannya menunjuk ke Mengintegrasikan pemrograman fungsional dan imperatif (1986) oleh Gifford dan Lucassen, yang menyebutkan empat jenis kelas efek : Murni, Fungsi, Pengamat dan Prosedur. Jadi, istilah "fungsi murni" berasal dari tulisan ini.
Namun perlu dicatat bahwa Peyton-Jones dan Wadler menyebutkan kekurangan dalam pendekatan ini. Yang perlu diperhatikan, kata mereka, adalah bahasa pemrograman Clean yang menggunakan tipe linier untuk memperkenalkan efek samping dengan cara yang aman (yaitu aman untuk kompiler). Pada dasarnya, thread ini Dunia sebagai variabel dalam semua fungsi terkait I / O, termasuk titik masuk utama .
Dengan itu, dimungkinkan untuk memiliki bahasa fungsional murni yang berinteraksi dengan dunia dan memiliki efek samping (I / O, OS, sistem Windowing, dll), bertentangan dengan sebagian definisi wikipedia Anda. Seseorang dapat mengatakan bahwa Haskell memiliki Bersih sebagai salah satu pengaruhnya; meskipun ia berangkat dari tipe linier dan menggunakan tipe-level konstruk (monad) lain untuk menjamin linieritas, yaitu referensi tunggal setiap saat.
sumber
(f_handle, world2) = fopen file_name, world
(pseudocode) dan panggilan berikutnya harus digunakanworld2
. Pada intinya program dilihat sebagai operasi di Semesta secara keseluruhan. Dengan kata lain, tidak ada efek samping ketika Anda beroperasi di Semesta :-)Definisi Wikipedia adalah kanonik. Dua persyaratan penting adalah:
Nilai balik dan perilaku fungsi adalah fungsi deterministik dari argumen yang secara eksplisit diteruskan ke fungsi.
Doa fungsi tidak memiliki efek samping yang dapat diamati.
Sebenarnya, D dan gcc seharusnya tidak menggunakan kata "murni" seperti yang mereka lakukan; ini merupakan penyalahgunaan terminologi standar.
sumber