คำที่เหมาะสมสำหรับฟังก์ชันผกผันกับตัวสร้างคือการแกะค่าออกจากชนิดข้อมูล


13

แก้ไข:ฉันกำลังใช้คำถามใหม่อีกครั้ง เห็นได้ชัดว่าฉันทำให้เกิดความสับสนเพราะฉันไม่ได้ตระหนักว่าคำว่าdestructorถูกใช้ใน OOP สำหรับสิ่งที่แตกต่างกันมาก - เป็นฟังก์ชันที่เรียกใช้เมื่อวัตถุถูกทำลาย ในการเขียนโปรแกรมการทำงานเรา (พยายาม) หลีกเลี่ยงสถานะที่เปลี่ยนแปลงไม่ได้ดังนั้นจึงไม่เทียบเท่ากับมัน (ฉันเพิ่มแท็กที่เหมาะสมให้กับคำถาม)

แต่ผมเคยเห็นว่าการบันทึกข้อมูลสำหรับ unwrapping ค่า (โดยเฉพาะอย่างยิ่งสำหรับชนิดข้อมูล valued เดียวเช่นnewtypes) บางครั้งเรียกว่าdestructorหรือบางทีอาจจะDeconstructor ตัวอย่างเช่นมี (ใน Haskell):

newtype Wrap = Wrap { unwrap :: Int }

นี่Wrapคือตัวสร้างและunwrapอะไร

คำถามคือ:

  • เราจะเรียกunwrapโปรแกรมการทำงานได้อย่างไร Deconstructor? Destructor? หรือคำอื่น ๆ ?
  • และเพื่อชี้แจงว่าคำศัพท์นี้ / อื่น ๆ สามารถใช้งานได้กับภาษาอื่น ๆหรือใช้ใน Haskell หรือไม่?
  • บางทีอาจมีคำศัพท์สำหรับเรื่องนี้โดยทั่วไปในภาษาที่ไม่สามารถใช้งานได้หรือไม่?

ฉันเห็นทั้งสองคำแล้วเช่น:

... บ่อยครั้งที่หนึ่งมีตัวสร้างสมาร์ทและdestructors ที่ฉลาดเหล่านี้เพื่อความสะดวกในการทำงานกับพวกเขา ...

ที่Haskell wikiหรือ

... ชุดรูปแบบทั่วไปที่นี่เพื่อฟิวส์ตัวสร้าง - คู่deconstructorเช่น ...

ที่Haskell wikibook (นี่อาจหมายถึงความหมายทั่วไปมากกว่าเล็กน้อย) หรือ

newtype DList a = DL { unDL :: [a] -> [a] }

ฟังก์ชั่น unDL เป็นตัวแยกส่วนของเราซึ่งจะลบตัวสร้าง DL ...

ในโลกแห่งความจริง Haskell


3
Destructor ดูเหมือนจะเป็นคำที่ใช้กันอย่างแพร่หลายมากที่สุด
Zavior

3
สิ่งนี้ดูเหมือนว่าจะเฉพาะกับ Haskell ("destructor" ใน Haskell ไม่ใช่แนวคิดเดียวกันกับใน C ++ ชื่อที่คล้ายคลึงกันนั้นทำให้เข้าใจผิด) หากคุณต้องการแนวคิดทั่วไปของ "การคลายคุณค่า" คุณอาจไม่ควรใช้ Haskell เป็นตัวอย่าง ในภาษา C ++ เช่น "unwrapper" อาจเป็นเพียงผู้ทะเยอทะยาน!
Andres F.

1
ฉันขอแนะนำให้คุณลบคำว่า "destructor" ออกจากคำถามใช้ "unwrapper" แทนและถามว่ามีชื่อทั่วไปสำหรับรูปแบบนี้ในหลายภาษาหรือไม่ :)
Andres F.

1
. unapply หรือ "extractor" เป็นแอนะล็อกหยาบในสกาล่า แต่อาจไม่มีชื่อเพราะในกรณีส่วนใหญ่คุณเพียงแค่จับคู่รูปแบบ
Gene T

คำตอบ:


5

มีหลายเงื่อนไขสำหรับแนวคิด การแยกชิ้นส่วนเป็นสิ่งที่ฉันเชื่อว่าเป็นเรื่องธรรมดาในแวดวง Haskell มันเป็นสิ่งที่ Real World Haskell เรียกมัน ฉันเชื่อว่าคำว่าการทำลายล้าง (หรือการผูกมัดการทำลายล้าง) เป็นเรื่องปกติในวงกลม Lisp


1
น่าสนใจว่าสิ่งเดียวกันได้รับเทอมที่แตกต่างกันจากภาษาหนึ่งไปยังอีกภาษาหนึ่งเช่นแผนที่กลายเป็นตัวเลือกใน C #, haskell มี fold lisp / java ได้ลดและ ruby ​​มีการฉีด, haskell ได้ผูก scala ได้ flatmap C # มี selectmany
Jimmy Hoffa

มันถูกเรียกว่า deconstruction ในวงกลม Haskell หากฟังดูแปลก ๆ โปรดจำไว้ว่า Haskell ไม่มีวัตถุใด ๆ ดังนั้นไปโดยไม่บอกว่าคำนั้นมีความหมายแตกต่างกัน ส่วนที่ดีคือ 'โครงสร้าง' เป็นสิ่งที่ทำ ในบันทึกนั้นฉันคิดว่าตัวแยกชิ้นส่วนของวัตถุควรจะเรียกบางสิ่งบางอย่างตามแนวของตัวกำจัดวัตถุ มันแม่นยำกว่ามาก
MasterMastic

8

Destructor เป็นคำที่ C ++ ใช้และอาจเป็นภาษาอื่นที่ฉันไม่รู้ พวกมันถูกใช้เพื่อปลดปล่อยทรัพยากรที่สร้างโดยนวกรรมิกดังนั้นพวกมันจึงทำสิ่งที่ตรงกันข้ามกับมัน บางทีแนวคิดอาจไม่ได้แปลเป็น Haskell อย่างแท้จริง แต่ดูเหมือนว่าจะใช้คำนี้ในบางสถานที่

แก้ไข: เมื่อพิจารณาถึงการแก้ไขของคุณฉันจะเรียกมันว่า unwrapper แล้ว ... ฉันสามารถตอบคำถามเดิม แต่ตอนนี้มันห่างไกลจากความรู้ของฉันดังนั้นอย่าจริงจังกับการแก้ไขนี้


1
โปรดทราบว่าการใช้ C ++ / C # / Java ของคำว่า "destructor" ไม่ตรงกับของ Haskell คำเดียวกันแนวคิดที่แตกต่าง
Andres F.

1
@AndresF ใช่นั่นเป็นเหตุผลที่ฉันเพิ่มประโยค:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset

1
ยุติธรรมพอฉันลบ downvote ของฉัน ฉันคิดว่าสิ่งที่เข้าใจผิดคือคำถามจริงซึ่งดูเหมือนว่าจะถามอะไร แต่จริง ๆ แล้วถามอีก! :)
Andres F.

@AndresF ใช่คำถามที่ทำให้เข้าใจผิด What's the proper term for a function inverse to a constructor?สหกรณ์ถาม: หากไม่มีการแก้ไขคำถามให้เจาะจงกับแนวคิดของ Haskell มากกว่านี้ฉันจะทิ้งคำตอบไว้ตามเดิม
marco-fiset

1
เพียงทราบ C # มี finalizers แต่ไม่ destructors ซึ่งแตกต่างกันเพราะ finalizers มีการดำเนินการที่ไม่ได้กำหนดไว้ ดังนั้นอาจแก้ไขคำตอบของคุณเพื่อไม่กระจายการเรียกชื่อผิดของ destructors ใน C #
จิมมี่ฮอฟฟา

6

ใน OOP คอนสตรัคเตอร์เป็นฟังก์ชั่นหรือภาษาที่สร้างและเริ่มต้นวัตถุใหม่ ('สร้าง' วัตถุ) และ destructor เป็นคู่ฟังก์ชั่นหรือภาษาที่สร้างขึ้นหลังจากวัตถุล้าง (โดยปล่อยทรัพยากรใด ๆ มัน ถือครอง) และลบทิ้ง

อย่างไรก็ตามเนื่องจาก Haskell (ซึ่งแตกต่างจากการพูด C ++) มีการรวบรวมขยะและไม่สนับสนุนสถานะที่ไม่แน่นอนหรือผลข้างเคียงอื่น ๆ (อย่างน้อยไม่ตรง) จึงไม่มีเหตุผลสำหรับความคิดทำลายล้างในความรู้สึก OOP นอกจากนี้ตัวสร้าง Haskell ซึ่งแตกต่างจากตัวสร้าง OOP มีแอปพลิเคชันมากกว่าการสร้างวัตถุ พวกมันยังถูกใช้อย่างมากในการจับคู่รูปแบบ (ดูตัวอย่างด้านล่าง)

ในตัวอย่างโค้ดของคุณ 'unwrap' เป็นฟิลด์บันทึกและขึ้นอยู่กับวิธีการใช้งานฉันอาจอ้างถึงมันเป็นaccessorหรืออาจเป็นทะเยอทะยาน (แม้ว่าหลังจะใช้ในบริบทของเลนส์ด้วยเช่นกัน) จริง ๆ แล้วจะสับสนเล็กน้อย)

ฉันไม่เคยได้ยินคำว่า 'destructor' (หรือ 'deconstructor') ที่ใช้ในบริบท Haskell มาก่อน ขณะที่แอนเดรสเอฟโน้ตอย่างไรก็ตามบางครั้งมันก็ใช้เพื่ออ้างถึงฟังก์ชั่นที่ยกเลิกการห่อแนะนำโดยนวกรรมิก เพื่อความเข้าใจของฉันผู้ทะเยอทะยานบันทึกอาจทำหน้าที่เป็นผู้ทำลายล้าง แต่อาจทำหน้าที่ปกติได้หากพวกเขาได้รับค่ากลับมาจากประเภทข้อมูลที่ซับซ้อนมากขึ้น ตัวอย่างรวมถึงmaybeและeitherจากโหมโรง

โปรดทราบว่าunwrapในตัวอย่างของคุณอาจมีหลายสิ่ง:

  • ฟังก์ชั่น (เหมือนกัน): คุณสามารถยกตัวอย่างเช่นทำmap unwrap [ Wrap 23, Wrap 42 ]; การใช้งานนี้เทียบเท่ากับวิธีทะเยอทะยานใน OOP
  • ตัวระบุเขตข้อมูลระเบียนในโครงสร้างของระเบียน: let w = Wrap { unwrap = 23 }
  • ตัวระบุเขตข้อมูลระเบียนในการปรับปรุงระเบียน: let w' = w { unwrap = 23 }; คล้ายกับวิธี setter ใน OOP (ถ้าคุณบีบมาก)
  • ตัวระบุฟิลด์บันทึกในการจับคู่รูปแบบ: f Wrap { unwrap = a } = a

อาจเป็นการดีที่สุดที่คุณจะนึกถึงตัวสร้าง Haskell เนื่องจากเป็นสิ่งที่แตกต่างไปจาก OOP constructors โดยสิ้นเชิง ผมแนะนำให้คุณ (ใหม่) อ่านหนังสือที่ดีเกี่ยวกับการเขียนโปรแกรมภาษา Haskell เพื่อความเข้าใจที่ดีกว่า - "โลกแห่งความจริง Haskell"เป็นสิ่งที่ดีจริงๆและฉันได้ยินสิ่งที่ดีเกี่ยวกับการ"เรียนรู้ให้คุณมีความ Haskell" ทั้งคู่ควรมีคำอธิบายที่ดีเกี่ยวกับตัวสร้างและการบันทึกไวยากรณ์โดยเฉพาะ


2
หลักฐานของการใช้คำว่า "เตาเผา" ในชุมชน Haskell: haskell.org/pipermail/beginners/2010-April/003946.htmlและmail-archive.com/haskell-cafe@haskell.org/msg26463.html "destructor" ใน Haskell lingo คือ "unwrapper" แนวคิดที่ไม่เกี่ยวข้องกับการจัดการหน่วยความจำหรือการสรุปวัตถุ
Andres F.

3
ผู้อำนวยการทำวิทยานิพนธ์ของฉันซึ่งเป็นผู้ทำรายการเฉพาะใน Haskell ก็ใช้คำว่า "destructor" แทนคำว่า unwrapper
Andres F.

ฉันไม่เคยเจอคำศัพท์นี้เลย คุณพูดถูกว่าเมื่อใช้แล้วจะไม่มีอะไรเกี่ยวข้องกับแนวคิด destructor ใน OOP
tdammers

@AndresF: แก้ไขเพื่อเป็นเกียรติแก่ข้อสังเกตของคุณ
tdammers

@AndresF นี่เป็นเรื่องที่น่าสนใจเพราะฉันไม่เคยได้ยินชื่อที่เรียกว่า destructor แม้ว่ามันจะไม่ถูกต้องที่จะอ้างถึงมันว่าเป็นสนามบันทึกและเทคนิคที่ฉันเห็นเรียกว่า "destructor" มีเพียงแค่รูปแบบการจับคู่ ? ฉันเข้าใจว่ามันเรียกว่า "การทำลายล้าง" เมื่อการจับคู่ของคุณดึงรายการออกจากกันนี่อาจเป็นคำที่เกี่ยวข้อง แต่อ้างอิง ADT หรือไม่ หลังจากการทำลายล้างรายการเพียงแค่ทำหน้าที่เกี่ยวกับ ADT นั่นคือสิ่งที่รายการคือ .. ฉันได้รับการทำลายล้างคำจากstackoverflow.com/questions/11677806/ …
Jimmy Hoffa

2

ฉันคิดว่าผู้ทำลายล้างเป็นคำที่กว้างขึ้น บางภาษาเช่น Java และ VB.NET มี finalizer /programming/171952/is-there-a-destructor-for-java


destructor ในภาษา C ++ เช่นเดียวกับทำการดำเนินการล้างข้อมูลก่อนที่จะปล่อยหน่วยความจำที่จัดสรร destructor ใน Haskell ไม่ทำการดึงค่าออกมาจาก "outer layer" (คุณไม่ได้ใช้มันเพื่อล้างข้อมูล) พวกเขาไม่ได้แนวคิดที่เกี่ยวข้องอย่างแท้จริง
Andres F.

2
ฉันเดาว่าฉันไม่ได้ตระหนักว่านี่เป็นคำถามของ Haskel
JeffO

มันไม่ชัดเจนแน่นอน คำถามได้รับการ retagged และปรับโครงสร้างใหม่แล้ว :)
Andres F.

2

เนื่องจากดูเหมือนจะไม่มีการประชุมข้ามภาษาฉันมักจะเรียกพวกเขาว่าตัวแยกข้อมูลเพราะนั่นเป็นคำที่ Scala ใช้สำหรับความคิดทั่วไปนั้นและเพราะมันไม่น่าจะสับสนกับการใช้งานที่มีอยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.