กลับไปหน้าบทความ

อ่าน 6 นาที

ประเภทข้อมูลพีชคณิตทั่วไป

ในการเขียนโปรแกรมเชิงฟังก์ชันประเภทข้อมูลพีชคณิตทั่วไป ( GADTหรือประเภทแฟนทอมชั้นหนึ่ง ประเภทข้อมูลเรียกซ้ำแบบมีเงื่อนไข หรือประเภทที่มีคุณสมบัติความเท่าเทียมกัน )...

ประเภทข้อมูลพีชคณิตทั่วไป

ในการเขียนโปรแกรมเชิงฟังก์ชันประเภทข้อมูลพีชคณิตทั่วไป ( GADTหรือประเภทแฟนทอมชั้นหนึ่ง [ 1 ]ประเภทข้อมูลเรียกซ้ำแบบมีเงื่อนไข [ 2 ] หรือประเภทที่มีคุณสมบัติความเท่าเทียมกัน[ 3 ] ) เป็นการวางนัยทั่วไปของประเภทข้อมูลพีชคณิตแบบพารามิเตอร์ (ADT)

ภาพรวม

ใน GADT นั้น ตัวสร้างผลิตภัณฑ์ (เรียกว่าตัวสร้างข้อมูลในHaskell ) สามารถให้การสร้างอินสแตนซ์ของ ADT อย่างชัดเจนได้ โดยใช้การสร้างอินสแตนซ์ของประเภทให้กับค่าที่ส่งคืน ซึ่งช่วยให้สามารถกำหนดฟังก์ชันที่มีพฤติกรรมประเภทที่ซับซ้อนยิ่งขึ้นได้ สำหรับตัวสร้างข้อมูลใน Haskell 2010 ค่าที่ส่งคืนจะมีประเภทที่กำหนดโดยนัยจากการสร้างอินสแตนซ์ของพารามิเตอร์ ADT ในการประยุกต์ใช้ตัวสร้าง

-- ADT แบบพาราเมตริกที่ไม่ใช่ GADT รายการข้อมูลa = Nil | Cons a ( รายการa )จำนวนเต็ม:: รายการจำนวนเต็ม= Cons 12 ( Cons 107 Nil )strings :: List String strings = Cons "boat" ( Cons "dock" Nil )-- ข้อมูลGADT Expr a ที่EBool :: Bool -> Expr Bool EInt :: Int -> Expr Int EEqual :: Expr Int -> Expr Int -> Expr Booleval :: Expr a -> a eval e = case e of EBool a -> a EInt a -> a EEqual a b -> ( eval a ) == ( eval b )expr1 :: Expr Bool expr1 = EEqual ( EInt 2 ) ( EInt 3 )ret = eval expr1 -- เท็จ

ปัจจุบันมีการนำไปใช้ในGlasgow Haskell Compiler (GHC) ในรูปแบบส่วนขยายที่ไม่เป็นมาตรฐาน ซึ่งใช้โดยPugsและDarcsเป็นต้นOCamlรองรับ GADT โดยตรงตั้งแต่เวอร์ชัน 4.00 [ 4 ]

การใช้งาน GHC ให้การสนับสนุนพารามิเตอร์ประเภทที่ระบุปริมาณเชิงการมีอยู่ และข้อจำกัดเฉพาะที่

ประวัติศาสตร์

Augustsson & Petersson (1994) ได้ อธิบาย รูปแบบข้อมูลพีชคณิตทั่วไปในเวอร์ชันแรกๆโดยอิงจากการจับคู่รูปแบบในALF

ประเภทข้อมูลพีชคณิตทั่วไปได้รับการแนะนำโดยอิสระโดยCheney & Hinze (2003) และก่อนหน้านั้นโดยXi, Chen & Chen (2003)ในฐานะส่วนขยายของประเภทข้อมูลพีชคณิตของMLและHaskell [ 5 ]ทั้งสองประเภทมีความเทียบเท่ากันโดยพื้นฐาน พวกมันคล้ายกับตระกูลประเภทข้อมูลอุปนัย (หรือประเภทข้อมูลอุปนัย ) ที่พบในแคลคูลัสของการสร้างอุปนัยของRocqและภาษาที่มีประเภทแบบพึ่งพา อื่นๆ โดยพิจารณาจากประเภทแบบพึ่งพา และยกเว้นว่าภาษาหลังมีข้อจำกัดด้านความเป็นบวกเพิ่มเติมซึ่งไม่ได้บังคับใช้ใน GADT [ 6 ]

Sulzmann, Wazny และ Stuckey (2006)ได้นำเสนอประเภทข้อมูลเชิงพีชคณิตแบบขยายซึ่งรวม GADT เข้ากับประเภทข้อมูลเชิงการมีอยู่และข้อจำกัด ของคลาสประเภท

การอนุมานประเภทในกรณีที่ไม่มีคำอธิบายประเภท ที่โปรแกรมเมอร์จัดหาให้ จะไม่สามารถตัดสินได้[ 7 ]และฟังก์ชันที่กำหนดไว้เหนือ GADT จะไม่ยอมรับประเภทหลักโดยทั่วไป[ 8 ]การสร้างประเภทใหม่ต้องอาศัยการแลกเปลี่ยนการออกแบบหลายประการ และเป็นพื้นที่ของการวิจัยที่กำลังดำเนินอยู่ ( Peyton Jones, Washburn & Weirich 2004 ; Peyton Jones et al. 2006 )

ในฤดูใบไม้ผลิปี 2021 Scala 3.0 ได้ถูกปล่อยออกมา[ 9 ]การอัปเดตครั้งสำคัญของScala นี้ ได้นำเสนอความเป็นไปได้ในการเขียน GADT [ 10 ]ด้วยไวยากรณ์เดียวกันกับประเภทข้อมูลพีชคณิต ซึ่งไม่ใช่กรณีในภาษาโปรแกรม อื่น ๆ ตามที่Martin Oderskyกล่าว ไว้ [ 11 ]

แอปพลิเคชัน

การประยุกต์ใช้ GADT ได้แก่การเขียนโปรแกรมทั่วไปการสร้างแบบจำลองภาษาการเขียนโปรแกรม ( ไวยากรณ์นามธรรมลำดับสูง ) การรักษาความไม่เปลี่ยนแปลงในโครงสร้างข้อมูลการแสดงข้อจำกัดในภาษาเฉพาะโดเมนที่ฝังตัวและการสร้างแบบจำลองวัตถุ[ 12 ]

ไวยากรณ์นามธรรมลำดับสูง

การประยุกต์ใช้ GADT ที่สำคัญอย่างหนึ่งคือการฝังไวยากรณ์นามธรรมลำดับสูงใน ลักษณะ ที่ปลอดภัยต่อประเภทข้อมูลต่อไปนี้คือการฝังแคลคูลัสแลมบ์ดาแบบกำหนดประเภทข้อมูลอย่างง่ายด้วยชุดประเภทข้อมูลพื้นฐานประเภทผลคูณ ( ทูเปิล ) และตัวรวมจุดคงที่แบบใดก็ได้ :

data Lam :: * -> * where Lift :: a -> Lam a -- ^ ค่าที่ยกขึ้นPair :: Lam a -> Lam b -> Lam ( a , b ) -- ^ ผลคูณLam :: ( Lam a -> Lam b ) -> Lam ( a -> b ) -- ^ นามธรรมแลมบ์ดาApp :: Lam ( a -> b ) -> Lam a -> Lam b -- ^ การประยุกต์ใช้ฟังก์ชันFix :: Lam ( a -> a ) -> Lam a -- ^ จุดคงที่

และฟังก์ชันการประเมินที่ปลอดภัยต่อประเภทข้อมูล:

eval :: Lam t -> t eval ( Lift v ) = v eval ( Pair l r ) = ( eval l , eval r ) eval ( Lam f ) = \ x -> eval ( f ( Lift x )) eval ( App f x ) = ( eval f ) ( eval x ) eval ( Fix f ) = ( eval f ) ( eval ( Fix f ))

ฟังก์ชันแฟกทอเรียลสามารถเขียนได้ดังนี้:

fact = Fix ( Lam ( \ f -> Lam ( \ y -> Lift ( if eval y == 0 then 1 else eval y * ( eval f ) ( eval y - 1 ))))) eval ( fact )( 10 )

หากใช้ชนิดข้อมูลพีชคณิตทั่วไป ปัญหาจะเกิดขึ้น การตัดพารามิเตอร์ชนิดข้อมูลออกจะทำให้ชนิดข้อมูลพื้นฐานที่ยกขึ้นมานั้นมีปริมาณเชิงการมีอยู่ ทำให้ไม่สามารถเขียนตัวประเมินได้ แม้จะมีพารามิเตอร์ชนิดข้อมูล แต่ก็ยังคงจำกัดอยู่เพียงชนิดข้อมูลพื้นฐานเดียว นอกจากนี้ นิพจน์ที่ไม่ถูกต้อง เช่นApp (Lam (\x -> Lam (\y -> App x y))) (Lift True)จะสามารถสร้างได้ ในขณะที่นิพจน์เหล่านั้นไม่ถูกต้องตามชนิดข้อมูลเมื่อใช้ GADT นิพจน์ที่ถูกต้องคือApp (Lam (\x -> Lam (\y -> App x y))) (Lift (\z -> True))นี่เป็นเพราะชนิดของxคือLam (a -> b)ซึ่งอนุมานได้จากชนิดของLamตัวสร้างข้อมูล

ดูเพิ่มเติม

หมายเหตุ

  1. ^เชนีย์และฮินซ์ 2003
  2. ซี, เฉิน และเฉิน 2003
  3. ^ Sheard & Pasalic 2004
  4. ^ "OCaml 4.00.1" . ocaml.org .
  5. เชนีย์และฮินซ์ 2003 , p. 25.
  6. เชนีย์และฮินซ์ 2003 , หน้า 25–26.
  7. เพย์ตัน โจนส์, Washburn & Weirich 2004 , p. 7.
  8. ชไรเวอร์ส และคณะ 2552 , หน้า. 1.
  9. กมิทึก, อนาโตลี. "สกาล่า 3 มาแล้ว!" . สกาลา -lang.org École Polytechnique Fédérale Lausanne (EPFL) เมืองโลซาน ประเทศสวิตเซอร์แลนด์ สืบค้นเมื่อ19 พฤษภาคม 2564 .
  10. "Scala 3 – จองประเภทข้อมูลพีชคณิต " สกาลา -lang.org École Polytechnique Fédérale Lausanne (EPFL) เมืองโลซาน ประเทศสวิตเซอร์แลนด์ สืบค้นเมื่อ19 พฤษภาคม 2564 .
  11. ^ Odersky, Martin. "A Tour of Scala 3 – Martin Odersky" . youtube.com . Scala Days Conferences. เก็บถาวรจากต้นฉบับเมื่อ 2021-12-19 . เรียกดูเมื่อ19 พฤษภาคม 2021 .
  12. เพย์ตัน โจนส์, Washburn & Weirich 2004 , p. 3.

อ่านเพิ่มเติม

แอปพลิเคชัน
  • Augustsson, เลนนาร์ต ; ปีเตอร์สัน, เคนท์ (กันยายน 1994) "ครอบครัวประเภทไร้สาระ" (PDF) .
  • Cheney, James ; Hinze, Ralf (2003). "First-Class Phantom Types". รายงานทางเทคนิค CUCIS TR2003-1901 . มหาวิทยาลัยคอร์เนล. hdl : 1813/5614 .
  • Xi, Hongwei ; Chen, Chiyan ; Chen, Gang (2003). "Guarded recursive datatype constructors". Proceedings of the 30th ACM SIGPLAN-SIGACT symposium on Principles of programming languages . ACM Press. หน้า  224–235 . CiteSeerX  10.1.1.59.4622 . doi : 10.1145/604131.604150 . ISBN 978-1581136289S2CID 15095297 ​
  • Sheard, Tim ; Pasalic, Emir (2004). "การเขียนโปรแกรมเมตาด้วยความเท่าเทียมกันของประเภทในตัว" . รายงานการประชุมเชิงปฏิบัติการนานาชาติครั้งที่สี่ว่าด้วยกรอบตรรกะและภาษาเมตา (LFM'04), คอร์ก . 199 : 49– 65. doi : 10.1016/j.entcs.2007.11.012 .
ความหมาย
  • Patricia Johann และ Neil Ghani (2008). " พื้นฐานสำหรับการเขียนโปรแกรมเชิงโครงสร้างด้วย GADT "
  • Arie Middelkoop, Atze Dijkstra และ S. Doaitse Swierstra (2011). " ข้อกำหนดที่กระชับสำหรับ GADT: ระบบ F พร้อมการพิสูจน์ความเท่าเทียมกันระดับเฟิร์สคลาส " การคำนวณลำดับสูงและเชิงสัญลักษณ์
การสร้างประเภทใหม่
  • Peyton Jones, Simon ; Washburn, Geoffrey ; Weirich, Stephanie (2004). "ประเภทที่สั่นคลอน: การอนุมานประเภทสำหรับประเภทข้อมูลพีชคณิตทั่วไป" (PDF) . รายงานทางเทคนิค MS-CIS-05-25 . มหาวิทยาลัยเพนซิลเวเนีย.
  • Peyton Jones, Simon ; Vytiniotis, Dimitrios ; Weirich, Stephanie ; Washburn, Geoffrey (2006). "การอนุมานประเภทแบบง่ายโดยใช้การรวมสำหรับ GADT" (PDF) . รายงานการประชุม ACM International Conference on Functional Programming (ICFP'06), พอร์ตแลนด์ .
  • Sulzmann, Martin ; Wazny, Jeremy ; Stuckey, Peter J. (2006). "กรอบงานสำหรับชนิดข้อมูลพีชคณิตแบบขยาย". ใน Hagiya, M.; Wadler, P. (บรรณาธิการ). การประชุมวิชาการนานาชาติครั้งที่ 8 ว่าด้วยการเขียนโปรแกรมเชิงฟังก์ชันและตรรกะ (FLOPS 2006) . บันทึกการบรรยายในวิทยาการคอมพิวเตอร์ . เล่มที่ 3945. หน้า  46–64 .
  • Sulzmann, Martin ; Schrijvers, Tom ; Stuckey, Peter J. (2006). "การอนุมานประเภทหลักสำหรับคลาสประเภทหลายพารามิเตอร์แบบ GHC" ใน Kobayashi, Naoki (บรรณาธิการ). ภาษาโปรแกรมและระบบ: การประชุมวิชาการเอเชียครั้งที่ 4 (APLAS 2006) . บันทึกการบรรยายในวิทยาการคอมพิวเตอร์. เล่มที่ 4279. หน้า  26–43 .
  • Schrijvers, Tom ; Peyton Jones, Simon ; Sulzmann, Martin ; Vytiniotis, Dimitrios (2009). "การอนุมานประเภทที่สมบูรณ์และตัดสินได้สำหรับ GADT" (PDF) . รายงานการประชุมนานาชาติ ACM SIGPLAN ครั้งที่ 14 ว่าด้วยการเขียนโปรแกรมเชิงฟังก์ชัน . หน้า  341–352 . doi : 10.1145/1596550.1596599 . ISBN 9781605583327S2CID 11272015 ​
  • Lin, Chuan-kai (2010). การอนุมานประเภทเชิงปฏิบัติสำหรับระบบประเภท GADT (PDF) (วิทยานิพนธ์ปริญญาเอก). มหาวิทยาลัย Portland State. เก็บถาวรจากต้นฉบับ(PDF)เมื่อ 2016-06-11 . สืบค้นเมื่อ2011-08-08 .
อื่น
  • Andrew Kennedy และ Claudio V. Russo. " ประเภทข้อมูลพีชคณิตทั่วไปและการเขียนโปรแกรมเชิงวัตถุ " ในรายงานการประชุมประจำปีครั้งที่ 20 ของ ACM SIGPLAN ว่าด้วยการเขียนโปรแกรมเชิงวัตถุ ระบบ ภาษา และแอปพลิเคชันสำนักพิมพ์ ACM, 2005.
  • หน้าข้อมูลประเภทพีชคณิตทั่วไป (Generalised Algebraic Datatype) บน วิกิของ Haskell
  • ประเภทข้อมูลพีชคณิตทั่วไปในคู่มือผู้ใช้ GHC
  • ประเภทข้อมูลพีชคณิตทั่วไปและการเขียนโปรแกรมเชิงวัตถุ
  • GADTs – Haskell Prime – Trac เก็บถาวรเมื่อ 2019-04-04 ที่Wayback Machine
  • เอกสารเกี่ยวกับการอนุมานประเภทสำหรับ GADTบรรณานุกรมโดยSimon Peyton Jones
  • การอนุมานประเภทด้วยข้อจำกัดบรรณานุกรมโดยSimon Peyton Jones
  • การจำลอง GADT ใน Java โดยใช้เลมมาของโยเนดะ
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Generalized_algebraic_data_type&oldid=1338280412 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ประเภทข้อมูลพีชคณิตทั่วไป

ในการเขียนโปรแกรมเชิงฟังก์ชันประเภทข้อมูลพีชคณิตทั่วไป ( GADTหรือประเภทแฟนทอมชั้นหนึ่ง ประเภทข้อมูลเรียกซ้ำแบบมีเงื่อนไข หรือประเภทที่มีคุณสมบัติความเท่าเทียมกัน )...

ภาพรวม

ใน GADT นั้น ตัวสร้างผลิตภัณฑ์ (เรียกว่า ตัวสร้างข้อมูล ใน Haskell ) สามารถให้การสร้างอินสแตนซ์ของ ADT อย่างชัดเจนได้ โดยใช้การสร้างอินสแตนซ์ของประเภทให้กับค่าที่ส่งคืน ซึ่งช่วยให้สามารถกำหนดฟังก์ชันที่มีพฤติกรรมประเภทที่ซับซ้อนยิ่งขึ้นได้...

ประวัติศาสตร์

Augustsson & Petersson (1994) ได้ อธิบาย รูปแบบข้อมูลพีชคณิตทั่วไปในเวอร์ชันแรกๆโดยอิงจาก การจับคู่รูปแบบ ใน ALF

แอปพลิเคชัน

การประยุกต์ใช้ GADT ได้แก่ การเขียนโปรแกรมทั่วไป การสร้างแบบจำลองภาษาการเขียนโปรแกรม ( ไวยากรณ์นามธรรมลำดับสูง ) การรักษา ความไม่เปลี่ยนแปลง ใน โครงสร้างข้อมูล การแสดงข้อจำกัดใน ภาษาเฉพาะโดเมนที่ฝังตัว และการสร้างแบบจำลองวัตถุ [ 12 ]