Apa arti istilah transparansi referensial ? Saya pernah mendengarnya digambarkan sebagai "itu berarti Anda dapat mengganti sama dengan sama dengan" tetapi ini sepertinya penjelasan yang tidak memadai.
285
Apa arti istilah transparansi referensial ? Saya pernah mendengarnya digambarkan sebagai "itu berarti Anda dapat mengganti sama dengan sama dengan" tetapi ini sepertinya penjelasan yang tidak memadai.
Jawaban:
Istilah "transparansi referensial" berasal dari filsafat analitis , cabang filsafat yang menganalisis konstruksi, pernyataan, dan argumen bahasa alami berdasarkan metode logika dan matematika. Dengan kata lain, itu adalah subjek terdekat di luar ilmu komputer dengan apa yang kita sebut semantik bahasa pemrograman . Filsuf Willard Quine bertanggung jawab untuk memprakarsai konsep transparansi referensial, tetapi juga tersirat dalam pendekatan Bertrand Russell dan Alfred Whitehead.
Pada intinya, "transparansi referensial" adalah ide yang sangat sederhana dan jelas. Istilah "rujukan" digunakan dalam filsafat analitik untuk membicarakan hal yang dirujuk oleh ungkapan . Ini kira-kira sama dengan apa yang kita maksud dengan "makna" atau "denotasi" dalam semantik bahasa pemrograman. Menggunakan contoh Andrew Birkett ( posting blog ), istilah "ibu kota Skotlandia" mengacu pada kota Edinburgh. Itu adalah contoh langsung dari "referensi".
Konteks dalam kalimat adalah "transparan referensial" jika mengganti istilah dalam konteks itu dengan istilah lain yang mengacu pada entitas yang sama tidak mengubah artinya. Sebagai contoh
artinya sama dengan
Jadi konteks "Parlemen Skotlandia bertemu di ..." adalah konteks referensial transparan. Kita dapat mengganti "ibu kota Skotlandia" dengan "Edinburgh" tanpa mengubah artinya. Dengan kata lain, konteksnya hanya peduli tentang apa yang merujuk istilah dan tidak ada yang lain. Itulah pengertian di mana konteksnya "transparan secara referensial".
Di sisi lain, dalam kalimat,
kita tidak bisa melakukan penggantian seperti itu. Jika kita melakukannya, kita akan mendapatkan "Edinburgh telah menjadi Edinburgh sejak 1999", yang merupakan hal yang gila untuk dikatakan, dan tidak menyampaikan arti yang sama dengan kalimat aslinya. Jadi, akan tampak bahwa konteks "Edinburgh telah ... sejak 1999" bersifat rujukan (kebalikan dari rujukan transparan). Tampaknya peduli tentang sesuatu yang lebih dari apa yang merujuk pada istilah itu. Apa itu?
Hal-hal seperti "ibu kota Skotlandia" disebut istilah yang pasti dan mereka tidak memberikan sakit kepala yang parah kepada ahli logika dan filsuf untuk waktu yang lama. Russell dan Quine memilah-milah mereka mengatakan bahwa mereka sebenarnya tidak "referensial", yaitu, adalah kesalahan untuk berpikir bahwa contoh di atas digunakan untuk merujuk pada entitas. Cara yang tepat untuk memahami "Edinburgh telah menjadi ibu kota Skotlandia sejak 1999" adalah dengan mengatakan
Kalimat ini tidak dapat diubah menjadi gila. Masalah terpecahkan! Maksud Quine adalah untuk mengatakan bahwa bahasa alami itu berantakan, atau paling tidak rumit, karena dibuat nyaman untuk penggunaan praktis, tetapi para filsuf dan ahli logika harus memberikan kejelasan dengan memahami mereka dengan cara yang benar. Transparansi referensial adalah alat yang digunakan untuk membawa kejelasan makna .
Apa hubungannya semua ini dengan pemrograman? Sebenarnya tidak terlalu banyak. Seperti yang kami katakan, transparansi referensial adalah alat untuk digunakan dalam memahami bahasa, yaitu, dalam menetapkan makna . Christopher Strachey , yang mendirikan bidang semantik bahasa pemrograman, menggunakannya dalam studinya tentang makna. Makalah dasarnya " Konsep dasar dalam bahasa pemrograman " tersedia di web. Ini adalah kertas yang indah dan semua orang bisa membaca dan memahaminya. Jadi, tolong lakukan itu. Anda akan jauh lebih tercerahkan. Dia memperkenalkan istilah "transparansi referensial" dalam paragraf ini:
Penggunaan "pada dasarnya" menunjukkan bahwa Strachey memparafrasekan untuk menjelaskannya secara sederhana. Pemrogram fungsional tampaknya memahami paragraf ini dengan caranya sendiri. Ada 9 kejadian lain dari "transparansi referensial" di koran, tetapi mereka tampaknya tidak peduli tentang yang lain. Bahkan, seluruh makalah Strachey dikhususkan untuk menjelaskan arti bahasa pemrograman imperatif . Tapi, hari ini, programmer fungsional mengklaim bahwa bahasa pemrograman imperatif tidak transparan secara referensi. Strachey akan berbalik di kuburnya.
Kita bisa menyelamatkan situasi. Kami mengatakan bahwa bahasa alami "berantakan, atau paling tidak rumit" karena dibuat nyaman untuk penggunaan praktis. Bahasa pemrograman adalah cara yang sama. Mereka "berantakan, atau setidaknya rumit" karena dibuat nyaman untuk penggunaan praktis. Itu tidak berarti bahwa mereka perlu membingungkan kita. Mereka hanya harus dipahami dengan cara yang benar, menggunakan bahasa meta yang secara transparan transparan sehingga kita memiliki kejelasan makna. Dalam makalah yang saya kutip, Strachey melakukan hal itu. Dia menjelaskan arti bahasa pemrograman imperatif dengan memecahnya menjadi konsep-konsep dasar, tidak pernah kehilangan kejelasan di mana pun. Bagian penting dari analisisnya adalah untuk menunjukkan bahwa ekspresi dalam bahasa pemrograman memiliki dua jenis "nilai",nilai-r . Sebelum karya Strachey, ini tidak dipahami dan kebingungan memerintah tertinggi. Saat ini, definisi C menyebutkannya secara rutin dan setiap programmer C memahami perbedaannya. (Apakah programmer dalam bahasa lain memahaminya sama baiknya adalah sulit untuk dikatakan.)
Baik Quine dan Strachey prihatin dengan makna konstruksi bahasa yang melibatkan beberapa bentuk ketergantungan konteks. Sebagai contoh, contoh kami "Edinburgh telah menjadi ibu kota Skotlandia sejak 1999" menandakan fakta bahwa "ibu kota Skotlandia" tergantung pada waktu di mana ia dipertimbangkan. Ketergantungan konteks seperti itu adalah kenyataan, baik dalam bahasa alami maupun bahasa pemrograman. Bahkan dalam pemrograman fungsional, variabel bebas dan terikat harus ditafsirkan sehubungan dengan konteks di mana mereka muncul. Ketergantungan konteks dari segala jenis blok transparansi referensial dalam beberapa cara atau yang lain. Jika Anda mencoba memahami arti istilah tanpa memperhatikan konteks yang menjadi sandarannya, Anda akan berakhir dengan kebingungan. Quine memperhatikan arti dari logika modal. Dia memegang itumodal logika secara rujukan bersifat buram dan harus dibersihkan dengan menerjemahkannya ke dalam kerangka kerja yang transparan secara referensial (misalnya, dengan menganggap perlunya sebagai provabilitas). Dia sebagian besar kehilangan perdebatan ini. Ahli logika dan filsuf sama-sama menemukan kemungkinan semantik dunia Kripke menjadi sangat memadai. Situasi serupa juga berkuasa dengan pemrograman imperatif. Ketergantungan negara dijelaskan oleh Strachey dan ketergantungan toko dijelaskan oleh Reynolds (dengan cara yang mirip dengan semantik dunia Kripke yang mungkin) sangat memadai. Pemrogram fungsional tidak tahu banyak tentang penelitian ini. Gagasan mereka tentang transparansi referensi harus diambil dengan sebutir garam besar.
[Catatan tambahan: Contoh-contoh di atas menggambarkan bahwa frasa sederhana seperti "ibu kota Skotlandia" memiliki banyak tingkat makna. Pada satu tingkat, kita mungkin berbicara tentang modal saat ini. Di tingkat lain, kita mungkin berbicara tentang semua ibukota yang mungkin dimiliki Skotlandia selama perjalanan waktu. Kita dapat "memperbesar" konteks tertentu dan "memperkecil" untuk menjangkau semua konteks dengan mudah dalam praktik normal. Efisiensi bahasa alami memanfaatkan kemampuan kita untuk melakukannya. Bahasa pemrograman imperatif sangat efisien dengan cara yang hampir sama. Kita dapat menggunakan variabel x di sisi kanan penugasan (nilai -r ) untuk berbicara tentang nilainya dalam keadaan tertentu. Atau, kita mungkin berbicara tentang nilai-lnyayang mencakup semua negara. Orang jarang bingung dengan hal-hal seperti itu. Namun, mereka mungkin atau mungkin tidak dapat secara tepat menjelaskan semua lapisan makna yang melekat dalam konstruksi bahasa. Semua lapisan makna seperti itu belum tentu 'jelas' dan itu adalah masalah ilmu pengetahuan untuk mempelajarinya dengan benar. Namun, ketidakberesan orang-orang biasa untuk menjelaskan makna berlapis seperti itu tidak menyiratkan bahwa mereka bingung tentang hal itu.]
"Catatan tambahan" di bawah ini mengaitkan diskusi ini dengan masalah pemrograman fungsional dan imperatif .
sumber
Transparansi referensial, istilah yang umum digunakan dalam pemrograman fungsional, berarti bahwa dengan diberi fungsi dan nilai input, Anda akan selalu menerima output yang sama. Artinya tidak ada kondisi eksternal yang digunakan dalam fungsi.
Berikut adalah contoh fungsi transparan referensial:
Dengan fungsi transparan referensial, diberi input dan fungsi, Anda bisa menggantinya dengan nilai alih-alih memanggil fungsi. Jadi alih-alih memanggil plusOne dengan parameter 5, kita bisa menggantinya dengan 6.
Contoh bagus lainnya adalah matematika secara umum. Dalam matematika diberi fungsi dan nilai input, itu akan selalu memetakan ke nilai output yang sama. f (x) = x + 1. Oleh karena itu fungsi dalam matematika secara referensi transparan.
Konsep ini penting bagi para peneliti karena itu berarti bahwa ketika Anda memiliki fungsi transparan referensial, itu cocok untuk paralelisasi dan caching otomatis yang mudah.
Transparansi referensial selalu digunakan dalam bahasa fungsional seperti Haskell.
-
Sebaliknya ada konsep kekaburan referensial. Ini berarti sebaliknya. Memanggil fungsi mungkin tidak selalu menghasilkan output yang sama.
Contoh lain, adalah fungsi anggota dalam bahasa pemrograman berorientasi objek. Fungsi anggota biasanya beroperasi pada variabel anggotanya dan karena itu akan menjadi referensial buram. Fungsi anggota tentu saja dapat secara transparan transparan.
Contoh lain adalah fungsi yang membaca dari file teks dan mencetak hasilnya. File teks eksternal ini dapat berubah kapan saja sehingga fungsinya akan menjadi kurang jelas.
sumber
Fungsi transparan referensial adalah yang hanya bergantung pada inputnya.
sumber
[Ini adalah catatan tambahan untuk jawaban saya sejak 25 Maret, dalam upaya untuk membawa diskusi lebih dekat dengan masalah pemrograman fungsional / imperatif.]
Gagasan programmer fungsional tentang transparansi referensial tampaknya berbeda dari gagasan standar dalam tiga cara:
Sedangkan para filsuf / ahli logika menggunakan istilah seperti "referensi", "denotasi", "designatum" dan " bedeutung " (istilah Jerman Frege), programmer fungsional menggunakan istilah "nilai". (Ini bukan sepenuhnya pekerjaan mereka. Saya perhatikan bahwa Landin, Strachey dan keturunan mereka juga menggunakan istilah "nilai" untuk berbicara tentang referensi / denotasi. Ini mungkin hanya penyederhanaan terminologis yang diperkenalkan oleh Landin dan Strachey, tetapi tampaknya membuat suatu perbedaan besar ketika digunakan dengan cara yang naif.)
Pemrogram fungsional tampaknya percaya bahwa "nilai" ini ada dalam bahasa pemrograman, bukan di luar. Dalam melakukan ini, mereka berbeda dari para filsuf dan semantikis bahasa pemrograman.
Mereka tampaknya percaya bahwa "nilai-nilai" ini seharusnya diperoleh dengan evaluasi.
Sebagai contoh, artikel Wikipedia tentang transparansi referensial mengatakan, pagi ini:
Ini sepenuhnya berbeda dengan apa yang dikatakan oleh para filsuf / ahli logika. Mereka mengatakan bahwa konteks adalah referensial atau transparan referensial jika suatu ekspresi dalam konteks itu dapat digantikan oleh ekspresi lain yang merujuk pada hal yang sama ( ekspresi coreferential ). Siapa para filsuf / ahli logika ini? Mereka termasuk Frege , Russell , Whitehead , Carnap , Quine , Churchdan banyak lainnya. Masing-masing dari mereka adalah sosok yang menjulang tinggi. Kekuatan intelektual gabungan dari para ahli logika ini sangat mengejutkan. Semuanya dengan suara bulat dalam posisi bahwa referensi / denotasi ada di luar bahasa formal dan ekspresi dalam bahasa hanya dapat berbicara tentang mereka. Jadi, yang bisa dilakukan seseorang dalam bahasa adalah mengganti satu ekspresi dengan ekspresi lain yang mengacu pada entitas yang sama. Referensi / denotasi itu sendiri tidak ada dalam bahasa. Mengapa programmer fungsional menyimpang dari tradisi yang sudah mapan ini?
Orang mungkin menganggap bahwa semantikis bahasa pemrograman mungkin telah menyesatkan mereka. Tetapi, mereka tidak melakukannya.
Landin :
Basi :
Bird and Wadler :
Jadi, dalam retrospeksi, upaya Landin dan Strachey untuk menyederhanakan terminologi dengan mengganti "referensi" / "denotasi" dengan "nilai" mungkin telah gegabah. Begitu seseorang mendengar "nilai", ada godaan untuk memikirkan proses evaluasi yang mengarah padanya. Sama-sama menggoda untuk memikirkan apa pun yang dihasilkan evaluasi sebagai "nilai", meskipun mungkin cukup jelas bahwa itu bukan denotasinya. Itulah yang saya kumpulkan telah terjadi pada konsep "transparansi referensial" di mata programmer fungsional. Tetapi "nilai" yang dibicarakan oleh semantikis awal bukanlah hasil dari evaluasi atau output dari suatu fungsi atau hal semacam itu. Ini adalah denotasi dari istilah tersebut.
Begitu kita memahami apa yang disebut "nilai" dari sebuah ekspresi ("referensi" atau "denotasi" dalam wacana filsuf klasik) sebagai objek matematika / konseptual yang kompleks, semua jenis kemungkinan terbuka.
Keengganan pemrogram fungsional untuk menyebut bahasa-bahasa seperti itu "transparan referensial" hanya menyiratkan bahwa mereka enggan mengakui objek matematika / konseptual yang rumit seperti "nilai". Di sisi lain, mereka tampaknya sangat bersedia menyebut transformator negara sebagai "nilai" ketika dimasukkan ke dalam sintaks favorit mereka sendiri dan didandani dengan kata buzz seperti "monad". Saya harus mengatakan bahwa mereka sepenuhnya tidak konsisten, bahkan jika kita mengabulkan kepada mereka bahwa ide mereka tentang "transparansi referensial" memiliki beberapa koherensi.
Sedikit sejarah mungkin menyoroti bagaimana kebingungan ini muncul. Periode antara 1962 hingga 1967 adalah periode yang sangat intensif bagi Christopher Strachey. Antara 1962-65, ia mengambil pekerjaan paruh waktu sebagai asisten peneliti dengan Maurice Wilkes untuk merancang dan mengimplementasikan bahasa pemrograman yang kemudian dikenal sebagai CPL. Ini adalah bahasa pemrograman imperatif tetapi dimaksudkan untuk memiliki kemampuan bahasa pemrograman fungsional yang kuat juga. Landin, yang adalah seorang karyawan Strachey di perusahaan konsultannya, memiliki pengaruh besar pada pandangan Strachey tentang bahasa pemrograman. Dalam makalah penting 1965 " Next 700 bahasa pemrograman ", Landin tanpa malu-malu mempromosikan bahasa pemrograman fungsional (menyebut mereka denotatifbahasa) dan menjelaskan bahasa pemrograman imperatif sebagai "antitesis" mereka. Dalam diskusi berikutnya, kami menemukan Strachey menimbulkan keraguan tentang posisi Landin yang kuat.
Pada 1965, Strachey mengambil posisi sebagai Pembaca di Oxford dan tampaknya telah bekerja penuh waktu untuk mengembangkan teori imperatif dan lompatan. Pada 1967, dia siap dengan teori, yang dia ajarkan dalam kursus tentang " konsep dasar dalam bahasa pemrograman " di sekolah musim panas Kopenhagen. Catatan kuliah itu seharusnya telah diterbitkan tetapi "sayangnya, karena pengeditan yang dilatory, prosesnya tidak pernah terwujud; seperti banyak pekerjaan Strachey di Oxford, bagaimanapun, makalah ini memiliki sirkulasi pribadi yang berpengaruh." ( Martin Campbell-Kelly )
Kesulitan mendapatkan tulisan-tulisan Strachey bisa menyebabkan kebingungan disebarkan, dengan orang-orang mengandalkan sumber-sumber sekunder dan kabar angin. Tapi, sekarang " konsep-konsep dasar " sudah tersedia di web, tidak perlu lagi menggunakan upaya menebak. Kita harus membacanya dan memutuskan apa yang dimaksud Strachey. Khususnya:
Setiap pembicaraan tentang "transparansi referensial" tanpa memahami perbedaan antara nilai-L, nilai-R dan objek kompleks lainnya yang mengisi semesta konseptual programmer imperatif secara fundamental salah.
sumber
Ekspresi transparan referensial jika dapat diganti dengan nilainya, tanpa mengubah algoritma, menghasilkan algoritma yang memiliki efek dan output yang sama pada input yang sama.
sumber
Fungsi transparan referensial adalah fungsi yang berfungsi seperti fungsi matematika; diberi input yang sama, selalu akan menghasilkan output yang sama. Ini menyiratkan bahwa keadaan yang disahkan tidak dimodifikasi, dan bahwa fungsi tidak memiliki keadaan sendiri.
sumber
Bagi mereka yang membutuhkan penjelasan singkat saya akan membahayakan satu (tetapi baca pengungkapan di bawah).
Transparansi referensial dalam bahasa pemrograman mempromosikan penalaran persamaan - semakin banyak transparansi referensial yang Anda miliki, semakin mudah untuk melakukan penalaran persamaan. Misalnya dengan definisi fungsi (semu),
fx = x + x,
kemudahan yang Anda dapat (dengan aman) mengganti f (foo) dengan foo + foo dalam lingkup definisi ini, tanpa memiliki terlalu banyak kendala di mana Anda dapat melakukan pengurangan ini, merupakan indikasi yang baik tentang seberapa banyak transparansi referensial bahasa pemrograman Anda telah.
Sebagai contoh jika foo adalah x ++ dalam pengertian pemrograman C maka Anda tidak bisa melakukan reduksi ini dengan aman (artinya, jika Anda melakukan reduksi ini, Anda tidak akan berakhir dengan program yang sama dengan yang Anda mulai).
Dalam bahasa pemrograman praktis Anda tidak akan melihat transparansi referensial yang sempurna tetapi programmer fungsional lebih memperhatikannya daripada kebanyakan (cf Haskell, di mana itu adalah tujuan inti).
(Pengungkapan penuh: Saya seorang programmer fungsional sehingga dengan jawaban teratas Anda harus mengambil penjelasan ini dengan sebutir garam.)
sumber
Jika Anda tertarik dengan etimologi (mis. Mengapa konsep ini memiliki nama khusus ini), lihat posting blog saya tentang topik tersebut. Terminologi berasal dari filsuf / ahli logika Quine.
sumber
Dalam 1 ada kejelasan dua bahasa yang dipertanyakan:
Dalam 2, berkat kedekatan objek dan bahasa logam, mereka bisa bingung.
Sebagai pelaksana bahasa, saya menemukan bahwa saya harus selalu mengingat perbedaan ini.
Jadi, Prof. Reddy, saya perkirakan Anda :-)
sumber
Saya berharap jawaban berikut menambah dan memenuhi kualifikasi jawaban 1 dan 3 yang kontroversial.
Mari kita akui bahwa suatu ungkapan menunjukkan atau merujuk pada beberapa referensi. Namun, pertanyaannya adalah apakah rujukan-rujukan ini dapat dikodekan secara isomorfis sebagai bagian dari ekspresi itu sendiri, menyebut ungkapan-ungkapan seperti itu 'nilai'. Sebagai contoh, nilai angka literal adalah himpunan bagian dari himpunan ekspresi aritmatika, nilai-nilai kebenaran adalah himpunan himpunan ekspresi boolean, dll. Idenya adalah untuk mengevaluasi ekspresi ke nilainya (jika ada). Jadi kata 'nilai' dapat merujuk pada denotasi atau elemen khusus dari rangkaian ekspresi. Tetapi jika ada isomorfisme (suatu penimbunan) antara referensi dan nilai, kita dapat mengatakan mereka adalah hal yang sama. (Ini mengatakan, seseorang harus berhati-hati untuk mendefinisikan referensi dan isomorfisme, sebagaimana dibuktikan oleh bidang semantik denotasional. Untuk memberi contoh yang disebutkan oleh balasan ke jawaban ke-3,
data Nat = Zero | Suc Nat
tidak sesuai seperti yang diharapkan pada himpunan bilangan asli.)Mari kita menulis
E[·]
untuk ekspresi dengan lubang, juga dikenal di beberapa tempat sebagai 'konteks'. Dua contoh konteks untuk ekspresi mirip-C adalah[·]+1
dan[·]++
.Mari kita menulis
[[·]]
untuk fungsi yang mengambil ekspresi (tanpa lubang) dan memberikan maknanya (referensi, denotasi, dll.) Di beberapa semesta yang menyediakan makna. (Saya meminjam notasi dari bidang semantik denotasional.)Mari kita sesuaikan definisi Quine secara formal sebagai berikut: konteks
E[·]
adalah referensial transparan jika diberikan dua ekspresiE1
danE2
(tidak ada lubang di sana) sehingga[[E1]] = [[E2]]
(yaitu ekspresi menunjukkan / merujuk ke referensi yang sama) maka itu adalah kasus yang[[E[E1]]] = [[E[E2]]]
(yaitu mengisi -dalam lubang dengan salah satuE1
atauE2
menghasilkan ekspresi yang juga menunjukkan referensi yang sama).Aturan Leibniz untuk mengganti sama dengan sama biasanya dinyatakan sebagai 'jika
E1 = E2
kemudianE[E1] = E[E2]
', yang mengatakan ituE[·]
adalah fungsi. Fungsi (atau dalam hal ini program menghitung fungsi) adalah pemetaan dari sumber ke target sehingga ada paling banyak satu elemen target untuk setiap elemen sumber. Fungsi non-deterministik adalah misnomer, mereka adalah hubungan, fungsi yang memberikan set, dll. Jika dalam aturan Leibniz persamaan=
adalah denotasional maka kurung ganda hanya diterima begitu saja dan diabaikan. Jadi konteks yang secara transparan transparan adalah fungsi. Dan aturan Leibniz adalah unsur utama dari penalaran persamaan, jadi alasan persamaan pasti terkait dengan transparansi referensial.Meskipun
[[·]]
merupakan fungsi dari ekspresi ke denotasi, ini bisa berupa fungsi dari ekspresi hingga 'nilai' yang dipahami sebagai subset ekspresi terbatas, dan[[·]]
dapat dipahami sebagai evaluasi.Sekarang, jika
E1
ini adalah ekspresi danE2
merupakan nilai, kita memiliki apa yang saya pikir dimaksud oleh kebanyakan orang ketika mendefinisikan transparansi referensial dalam hal ekspresi, nilai, dan evaluasi. Tetapi seperti yang diilustrasikan oleh jawaban pertama dan ketiga di halaman ini, ini adalah definisi singkat.Masalah dengan konteks seperti
[·]++
bukan efek samping, tetapi nilainya tidak didefinisikan dalam C secara isomorfis dengan artinya. Fungsi bukan nilai (well, pointer ke fungsi) sedangkan dalam bahasa pemrograman fungsional mereka adalah. Landin, Strachey, dan pelopor semantik denotasional cukup pintar dalam menggunakan dunia fungsional untuk memberikan makna.Untuk bahasa mirip C yang imperatif, kami dapat (secara kasar) menyediakan semantik untuk ekspresi menggunakan fungsi
[[·]] : Expression -> (State -> State x Value)
.Value
adalah bagian dariExpression
.State
mengandung pasangan (pengidentifikasi, nilai). Fungsi semantik mengambil ekspresi dan memberikan sebagai artinya fungsi dari keadaan saat ini ke pasangan dengan keadaan yang diperbarui dan nilai. Sebagai contoh,[[x]]
adalah fungsi dari kondisi saat ini ke pasangan yang komponen pertamanya adalah kondisi saat ini dan yang komponen kedua adalah nilai x. Sebaliknya,[[x++]]
adalah fungsi dari kondisi saat ini ke pasangan yang komponen pertamanya adalah keadaan di mana nilai x bertambah, dan komponen kedua mana yang sangat bernilai. Dalam pengertian ini, konteksnya[·]++
adalah transparan referensial jika memenuhi definisi yang diberikan di atas.Saya pikir programmer fungsional berhak menggunakan transparansi referensial dalam arti bahwa mereka secara alami pulih
[[·]]
sebagai fungsi dari ekspresi ke nilai. Fungsinya adalah nilai kelas satu dan negara juga bisa menjadi nilai, bukan denotasi. State monad adalah (sebagian) mekanisme bersih untuk melewati (atau threading) negara.sumber
Perhatikan bahwa konsep "makna" ini adalah sesuatu yang terjadi dalam pikiran pengamat. Dengan demikian, "referensi" yang sama dapat memiliki arti yang berbeda bagi orang yang berbeda. Jadi, misalnya, kami memiliki halaman disambiguasi Edinburgh di Wikipedia.
Masalah terkait yang dapat muncul dalam konteks pemrograman mungkin polimorfisme.
Dan mungkin kita harus memiliki nama untuk kasus khusus polimorfisme (atau mungkin bahkan casting) di mana untuk tujuan kita kasus polimorfik yang berbeda setara secara semantik (bukan hanya menjadi serupa. Misalnya, angka 1 - yang mungkin diwakili menggunakan tipe integer, atau tipe kompleks atau salah satu dari berbagai tipe lainnya - dapat diperlakukan secara polimorfik).
sumber
Saya menemukan definisi transparansi referensial dalam buku " Struktur dan Implementasi Program Komputer " (Buku Panduan) berguna karena dilengkapi dengan penjelasan tentang bagaimana transparansi referensial dilanggar dengan memperkenalkan operasi penugasan . Lihat slide deck berikut yang saya buat tentang subjek: https://www.slideshare.net/pjschwarz/introducing-assignment-invalidates-the-substitusi-model-of-evaluation-and-violates-referential-transparency-as- menjelaskan-dalam-sicp-the-wisaya-buku
sumber
Transparansi referensial dapat dengan sederhana dinyatakan sebagai:
Sebagai contoh, bahasa pemrograman Haskell adalah bahasa fungsional murni; yang berarti bahwa itu transparan referensial.
sumber