ประเภทสากลเป็นประเภทย่อยหรือกรณีพิเศษของประเภทที่มีอยู่หรือไม่


20

ฉันต้องการที่จะรู้ว่าประเภทเชิงปริมาณแบบ :เป็นประเภทย่อยหรือ กรณีพิเศษของประเภทมีมีลายเซ็นเดียวกัน: T_e = \ มีอยู่ X: \ left \ {a \ in X, f: X → \ {T, F \} \ right \}T a = X : { a X , f : X { T , F } } T e T e = X : { a X , f : X { T , F } }Ta

Ta=X:{aX,:X{T,F}}
Tอี
Te=X:{aX,f:X{T,F}}

ฉันจะพูดว่า "ใช่": หากสิ่งที่เป็นจริง "สำหรับทุก X" ( X ) ก็ต้องเป็นจริง "สำหรับบาง X" ( X ) นั่นคือคำสั่งด้วย ' ' เป็นเพียงรุ่นที่ จำกัด มากขึ้นของคำสั่งเดียวกันกับ ' :

X,P(X)?X,P(X).

ฉันผิดที่ไหน

พื้นหลัง: ทำไมฉันจึงถามสิ่งนี้

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

น่าเสียดายที่ตัวอย่างรหัสที่ดีนั้นหายากเพราะภาษาการเขียนโปรแกรมส่วนใหญ่มีการสนับสนุนที่ จำกัด สำหรับประเภทที่มีอยู่เท่านั้น (ตัวอย่างเช่นHaskell'sforallหรือwildcard ของ Java? ) ในอีกทางหนึ่งประเภทที่ได้รับการสนับสนุนเชิงปริมาณได้รับการสนับสนุนโดยภาษาล่าสุดมากมายผ่าน "generics"

สิ่งที่แย่กว่านั้นคือgenerics ดูเหมือนจะผสมกับประเภทอัตถิภาวนิยมได้อย่างง่ายดายเช่นกันทำให้ยากยิ่งขึ้นที่จะแยกแยะอัตถิภาวนิยมจากประเภทสากล ฉันอยากรู้ว่าทำไมการผสมผสานนี้เกิดขึ้นได้อย่างง่ายดาย คำตอบสำหรับคำถามนี้อาจอธิบายได้: หากประเภทสากลเป็นเพียงกรณีพิเศษของประเภทที่มีอยู่จริงก็ไม่น่าแปลกใจที่ประเภททั่วไปเช่น Java ของList<T>สามารถตีความได้ทั้งสองวิธี


1
อะไรคือความแตกต่างระหว่างสากลกับสิ่งมีชีวิต?

ศาสตร์พูดคุณมีสิทธิ: ถ้าแล้วforall x. P(x) exists x. P(x)ระบบการพิมพ์คำนึงถึงประเภทนี้หรือไม่เมื่อตรวจสอบประเภท ... ฉันไม่มีความคิด +1 สำหรับคำถามที่น่าสนใจ

1
@deinan: หากP (x)ไม่ถือสำหรับxใด ๆกว่าแน่นอน ∀xP (x)ไม่ถือ สิ่งที่คุณอาจหมายคือเมื่อไม่มีxที่เป็น∀x∈XP (x)ไม่ได้หมายความ∃x∈XP (x)ถ้าX = ∅

1
... และโปรดทราบว่าหากสิ่งเหล่านั้นถูกเขียนใหม่โดยไม่ต้องมีเครื่องหมายกำกับไว้พวกเขาจะดูแตกต่าง: ∀xx∈X⇒P (x)กับ∃xx∈X & P (x)และ∃xx∈X⇒P (x)จะได้รับความพึงพอใจนิด ๆ โดยใด ๆxไม่ได้มาจากx

1
คำถามเจ๋ง ใน Haskell เป็นเรื่องจริงที่ค่าของประเภท (forall b. แสดง b => b) สามารถส่งผ่านไปยังฟังก์ชันที่ใช้ (forall b. b) แต่ไม่ใช่ในทางกลับกันซึ่งหมายถึงความสามารถทดแทนที่คุณคาดหวังจาก ความสัมพันธ์ของการพิมพ์ย่อย แต่แน่นอนเมื่อคุณพูดถึงประเภทคุณควรพูดถึงระบบประเภทที่คุณกำลังมองหาโดยเฉพาะอย่างยิ่งถ้าคุณมีพีชคณิตแบบเป็นทางการอยู่ในใจสำหรับความหมายของคุณ ...

คำตอบ:


10

ครั้งแรกจากจุดทางคณิตศาสตร์ในมุมมองของไม่ได้หมายความ(x) ความหมายถือถ้าหากไม่ว่างเปล่า อย่างไรก็ตามในการเขียนโปรแกรมภาษามันเป็นเรื่องแปลกที่จะจัดการกับประเภทที่ว่างเปล่า (แม้ว่ามันจะเกิดขึ้น)x:T,P(x)x:T,P(x)T

ยังคงมาจากมุมมองทางคณิตศาสตร์แม้ว่าทั้งสองจะไม่เหมือนกัน หากคุณให้ประเภทซีแมนทิกส์เป็นชุดจะเป็นชุดซูเปอร์เซ็ตของไม่ใช่ประเภทเดียวกัน (อันที่จริงมันไม่ใช่ซูเปอร์เซ็ต แต่มันใกล้เคียงกับไอโซมอร์ฟิคถึงซูเปอร์เซ็ต)(x:T,P(x))(x:T,P(x))TaTอี

ลองเข้าใกล้ทฤษฎีภาษาโปรแกรมและดูว่าประเภทเหล่านี้หมายถึงอะไรจริง เป็นประเภทสากล: หากคุณมีค่าประเภทนั้นคุณสามารถสร้างสำหรับใด ๆ. โดยเฉพาะอย่างยิ่งถ้าคุณมีและทั้งสองประเภทคุณสามารถสร้างและ(M_2) ในสาระสำคัญ (และอาจมีผลขึ้นอยู่กับภาษา)เป็นฟังก์ชั่นจากประเภทถึงข้อกำหนด เช่นประเภทสากลให้พิมพ์parametrization : หนึ่งค่าทำงานสำหรับทุกประเภท ประเภทสากลเป็นหัวใจของTa=X.{a:X,:Xโอโอล.}AA(M)M:XM1M2XA(M1)A(M2)Taความแตกต่าง

ประเภทอัตถิภาวนิยมเป็นสัตว์ที่แตกต่างกันมาก ให้ค่าประเภทมีเพียงหนึ่งเทอมนั่นคือและสำหรับคำนี้\} ประเภทอัตถิภาวนิยมมีวิธีที่จะซ่อนธรรมชาติของ ; มันกำลังพูดว่า“ มีประเภทอยู่! แต่ฉันจะไม่บอกคุณ!” ดังนั้นประเภทที่เป็นอยู่จึงมีประเภทที่เป็นนามธรรม : หนึ่งค่าที่ซ่อนอยู่เฉพาะ ประเภทอัตถิภาวนิยมที่เป็นหัวใจของระบบโมดูลTอี=X.{a:X,:Xโอโอล.}BTอียังไม่มีข้อความ:Xπ1(B)=ยังไม่มีข้อความπ2(B)={a:ยังไม่มีข้อความ,:ยังไม่มีข้อความโอโอล.}ยังไม่มีข้อความ

อย่าเข้าใจผิดโดย Haskell's forall: แม้จะมีชื่อ แต่เป็นรูปแบบของปริมาณที่มีอยู่จริง

สำหรับพื้นหลังฉันขอแนะนำประเภทและภาษาการเขียนโปรแกรม (บทที่ 23 และ 24 อภิปรายประเภทสากลและประเภทที่มีอยู่ตามลำดับ) มันจะให้ข้อมูลพื้นฐานที่เป็นประโยชน์เพื่อทำความเข้าใจบทความวิจัย


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

1
ประเภทของการดำรงอยู่ที่รองรับโดย GHC เป็นประเภทที่ (โดยตรงหรือโดยอ้อม) มีตัวนับสากลซึ่งเห็นได้จาก "ภายนอก" เกิดขึ้นในตำแหน่งที่แตกต่างกัน สิ่งนี้ใช้ความเป็นคู่อย่างคร่าวๆกับตรรกะการปฏิเสธดังนั้นเพื่อที่จะมีประเภทที่มีอยู่เช่นนี้ในระดับบนสุดพวกเขาจะต้องเป็นสองเท่า contravariant ใช้การเข้ารหัสแบบ CPS เหมือน (นี่คือความเท่าเทียม Uday Reddy ให้) โปรดทราบว่าปริมาณที่มีอยู่ใน intuitionistic นำเสนอความไม่สะดวกที่คล้ายกันด้วยเหตุผลที่คล้ายกัน
CA McCann

5

X.P(X)X.P(X)

X.(X×(XBโอโอล.))XX.(X×(XBโอโอล.))

 f (p: \forall X. (X * (X -> Bool))) = PACK X = Bool WITH p[Bool]

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

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

X.P(X)Y.(X.P(X)Y)Y

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