Sunting: Saya sedikit mengulang pertanyaan itu. Rupanya saya menyebabkan beberapa kebingungan karena saya tidak menyadari bahwa istilah destructor digunakan dalam OOP untuk sesuatu yang sangat berbeda - itu adalah fungsi yang dipanggil ketika suatu objek sedang dihancurkan. Dalam pemrograman fungsional kita (mencoba) menghindari keadaan yang bisa berubah sehingga tidak ada yang setara dengannya. (Saya menambahkan tag yang tepat ke pertanyaan.)
Alih-alih, saya telah melihat bahwa bidang rekaman untuk membuka bungkus nilai (terutama untuk tipe data bernilai tunggal seperti newtype
s) kadang-kadang disebut destruktor atau mungkin dekonstruktor . Sebagai contoh, mari kita miliki (di Haskell):
newtype Wrap = Wrap { unwrap :: Int }
Ini Wrap
konstruktornya dan unwrap
apa?
Pertanyaannya adalah:
- Bagaimana kita memanggil
unwrap
pemrograman fungsional? Dekonstruktor? Destructor? Atau dengan istilah lain? - Dan untuk memperjelas, apakah ini / terminologi lain berlaku untuk bahasa fungsional lainnya , atau hanya digunakan di Haskell?
- Mungkin juga, adakah terminologi untuk ini secara umum, dalam bahasa yang tidak berfungsi ?
Saya telah melihat kedua istilah tersebut, misalnya:
... Paling sering, satu memasok konstruktor dan penghancur pintar untuk ini agar mudah bekerja dengan mereka. ...
di Haskell wiki , atau
... Tema umum di sini adalah memadukan konstruktor - pasangan dekonstruktor seperti ...
di Haskell wikibook (di sini mungkin maksudnya sedikit lebih umum), atau
newtype DList a = DL { unDL :: [a] -> [a] }
Fungsi unDL adalah dekonstruktor kami , yang menghapus konstruktor DL. ...
di Dunia Nyata Haskell .
sumber
Jawaban:
Ada beberapa istilah untuk konsep tersebut. Dekonstruksi adalah apa yang saya yakini umum di kalangan Haskell, itulah yang disebut Real World Haskell. Saya percaya istilah destrrukturisasi (atau ikatan restrukturisasi) adalah umum di kalangan Lisp.
sumber
Destructor adalah istilah yang digunakan oleh C ++ dan mungkin bahasa lain yang tidak saya ketahui. Mereka digunakan untuk melepaskan sumber daya yang dibuat oleh konstruktor sehingga mereka melakukan sebaliknya. Mungkin konsepnya tidak diterjemahkan secara harfiah ke Haskell, tetapi istilah itu tampaknya digunakan di beberapa tempat.
EDIT: Mempertimbangkan hasil pengeditan Anda untuk pertanyaan, saya akan menyebutnya sebagai nonrapper saat itu ... Saya bisa menjawab pertanyaan asli tapi sekarang sudah menjauh dari pengetahuan saya jadi jangan menganggap suntingan ini terlalu serius.
sumber
Maybe in Haskell this does not translate really well but I don't know the language.
What's the proper term for a function inverse to a constructor?
. Kecuali jika pertanyaannya diedit untuk lebih spesifik pada beberapa konsep Haskell, saya akan membiarkan jawaban saya apa adanya.Dalam OOP, konstruktor adalah fungsi atau konstruksi bahasa yang membuat dan menginisialisasi objek baru ('membangun' objek), dan destruktor adalah ganda, fungsi atau konstruksi bahasa yang membersihkan setelah objek (dengan melepaskan sumber daya apa pun itu) memegang) dan menghapusnya.
Namun, karena Haskell (tidak seperti, katakanlah, C + +) memiliki pengumpulan sampah dan tidak mendukung keadaan dapat berubah atau efek samping lainnya (setidaknya tidak secara langsung), sama sekali tidak ada alasan untuk gagasan destruktor dalam pengertian OOP. Selain itu, konstruktor Haskell, tidak seperti konstruktor OOP, memiliki lebih banyak aplikasi daripada sekadar pembuatan objek; mereka juga banyak digunakan dalam pencocokan pola (lihat di bawah untuk contoh).
Dalam contoh kode Anda, 'buka' adalah bidang rekaman , dan tergantung pada bagaimana ia digunakan, saya mungkin menyebutnya sebagai pengakses , atau mungkin bahkan pengambil (meskipun yang terakhir juga digunakan dalam konteks lensa, jadi mungkin sebenarnya agak membingungkan).
Saya belum pernah mendengar istilah 'destructor' (atau 'deconstructor') yang digunakan dalam konteks Haskell sendiri; seperti yang dicatat oleh Andres F., terkadang digunakan untuk merujuk ke fungsi yang membatalkan pembungkus yang diperkenalkan oleh konstruktor. Menurut pemahaman saya, pengambil rekor dapat berfungsi sebagai destruktor, tetapi begitu juga fungsi biasa, asalkan mereka mendapatkan nilai kembali dari tipe data yang lebih kompleks. Contohnya termasuk
maybe
daneither
dari Pendahuluan.Perhatikan bahwa
unwrap
, dalam contoh Anda, dapat beberapa hal:map unwrap [ Wrap 23, Wrap 42 ]
; penggunaan ini kira-kira setara dengan metode pengambil dalam OOP.let w = Wrap { unwrap = 23 }
let w' = w { unwrap = 23 }
; ini mirip dengan metode penyetel di OOP (jika Anda sering menekan).f Wrap { unwrap = a } = a
Mungkin lebih baik untuk menganggap konstruktor Haskell sebagai sesuatu yang sama sekali berbeda dari konstruktor OOP. Saya sarankan Anda (kembali) membaca buku yang bagus tentang bahasa pemrograman Haskell untuk pemahaman yang lebih baik - "Real World Haskell" benar-benar bagus, dan saya telah mendengar hal-hal baik tentang "Learn You A Haskell" . Keduanya harus memiliki penjelasan yang baik tentang konstruktor dan khususnya catatan sintaksis.
sumber
Saya pikir destructor adalah istilah yang lebih luas. Beberapa bahasa seperti Java dan VB.NET memiliki finalizer. /programming/171952/is-there-a-destructor-for-java
sumber
Karena tampaknya tidak ada konvensi lintas-bahasa, saya biasanya menyebutnya ekstraktor , karena itulah istilah yang digunakan Scala untuk gagasan umum itu, dan karena itu tidak mungkin dikacaukan dengan penggunaan yang ada.
sumber