Apa istilah yang tepat untuk fungsi terbalik ke konstruktor - untuk membuka nilai dari tipe data?

13

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 newtypes) kadang-kadang disebut destruktor atau mungkin dekonstruktor . Sebagai contoh, mari kita miliki (di Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Ini Wrapkonstruktornya dan unwrapapa?

Pertanyaannya adalah:

  • Bagaimana kita memanggil unwrappemrograman 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 .

Petr Pudlák
sumber
3
Destructor tampaknya menjadi istilah yang paling banyak digunakan
Zavior
3
Ini sepertinya dikhususkan untuk Haskell ("destruktor" di Haskell bukan konsep yang sama seperti di C ++. Kesamaan namanya menyesatkan). Jika Anda ingin konsep umum "membuka nilai", Anda mungkin tidak boleh menggunakan Haskell sebagai contoh. Dalam bahasa C ++ - like, "unwrapper" semacam itu mungkin hanya pengambil!
Andres F.
1
Saya sarankan Anda menghapus kata "destructor" dari pertanyaan, gunakan "unwrapper" sebagai gantinya, dan tanyakan apakah ada nama umum untuk pola ini di seluruh bahasa :)
Andres F.
1
.unapply, atau "extractor" adalah analog kasar dalam skala, tapi mungkin tidak ada nama karena dalam kebanyakan kasus Anda cukup mencocokkan pola
Gene T

Jawaban:

5

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.

stonemetal
sumber
1
Menarik bagaimana hal yang sama mendapatkan istilah yang berbeda dari satu bahasa ke bahasa berikutnya, seperti peta berubah menjadi pilih di C #, haskell memiliki lipatan lisp / java telah berkurang dan ruby ​​telah menyuntikkan, haskell telah mengikat scala memiliki flatmap C # telah memilihbanyak
Jimmy Hoffa
Ini memang disebut dekonstruksi di kalangan Haskell. Jika kedengarannya aneh, perlu diingat bahwa Haskell tidak memiliki objek - hanya nilai; Maka tak perlu dikatakan bahwa istilah tersebut memiliki arti yang berbeda. Bagian yang hebat adalah bahwa 'dekonstruksi' persis seperti apa fungsinya. Pada catatan itu saya pribadi berpikir dekonstruktor objek harus disebut sesuatu di sepanjang garis pembuang objek. Itu jauh, jauh lebih akurat.
MasterMastic
8

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.

marco-fiset
sumber
1
Perhatikan bahwa penggunaan C ++ / C # / Java pada istilah "destructor" tidak cocok dengan Haskell. Kata yang sama, konsep yang berbeda.
Andres F.
1
@AndresF. Ya, itu sebabnya saya menambahkan kalimat:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset
1
Cukup adil, saya menghapus downvote saya. Saya pikir apa yang salah arah adalah pertanyaan aktual, yang tampaknya menanyakan satu hal, tetapi sebenarnya menanyakan hal lain! :)
Andres F.
@AndresF. Ya pertanyaannya menyesatkan. OP bertanya: 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.
marco-fiset
1
Sekedar catatan, C # memiliki finalizers tetapi bukan destructor, yang berbeda karena finalizers memiliki eksekusi non-deterministik. Jadi, mungkin edit jawaban Anda untuk tidak menyebarkan kesalahan nama destruktor di C #.
Jimmy Hoffa
6

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 maybedan eitherdari Pendahuluan.

Perhatikan bahwa unwrap, dalam contoh Anda, dapat beberapa hal:

  • fungsi (sama seperti yang lain): Anda dapat, misalnya, melakukan map unwrap [ Wrap 23, Wrap 42 ]; penggunaan ini kira-kira setara dengan metode pengambil dalam OOP.
  • specifier bidang rekaman dalam konstruksi rekaman: let w = Wrap { unwrap = 23 }
  • specifier bidang rekaman dalam pembaruan catatan: let w' = w { unwrap = 23 } ; ini mirip dengan metode penyetel di OOP (jika Anda sering menekan).
  • specifier bidang rekaman dalam pencocokan pola: 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.

tammmer
sumber
2
Bukti penggunaan istilah "destruktor" di komunitas Haskell: haskell.org/pipermail/beginners/2010-April/003946.html dan mail-archive.com/[email protected]/msg26463.html . "Destruktor" dalam bahasa Haskell adalah "unwrapper", sebuah konsep yang sama sekali tidak terkait dengan manajemen memori atau finalisasi objek.
Andres F.
3
Direktur tesis saya, yang memprogram secara eksklusif di Haskell, juga menggunakan istilah "penghancur" untuk orang yang tidak berbobot.
Andres F.
Yah, saya belum pernah menemukan istilah itu. Anda benar bahwa, ketika digunakan, itu sama sekali tidak ada hubungannya dengan konsep destruktor di OOP.
tdammers
@AndresF .: Diedit untuk menghormati komentar Anda.
Pelaku
@AndresF. Ini menarik karena saya juga tidak pernah mendengarnya disebut sebagai destruktor, meskipun selain itu, apakah itu juga tidak akurat untuk hanya menyebutnya sebagai bidang rekaman, dan teknik yang saya lihat disebut "destruktor" di sana hanya sebagai pencocokan pola ? Saya mengerti ini disebut "perusakan" ketika pertandingan Anda menarik daftar, apakah ini istilah yang terkait tetapi merujuk pada ADT? Setelah semua merusak daftar hanya bertindak pada ADT karena itulah daftar itu .. Saya mendapat istilah destrukturisasi dari stackoverflow.com/questions/11677806/...
Jimmy Hoffa
2

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

JeffO
sumber
Destruktor dalam bahasa mirip C ++ melakukan tindakan pembersihan sebelum melepaskan memori yang dialokasikan. Sebuah destruktor di Haskell membuka nilai dari "lapisan luar" -nya (Anda tidak menggunakannya untuk membersihkan apa pun). Mereka tidak benar-benar terkait konsep.
Andres F.
2
Saya kira saya tidak menyadari ini adalah pertanyaan Haskel.
JeffO
Memang tidak jelas. Pertanyaannya sekarang telah ditata ulang dan dirumuskan ulang :)
Andres F.
2

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.

Api Ptharien
sumber