ระบบประเภทคืออะไร?


50

พื้นหลัง

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

ในระหว่างการพูดคุยของฉันฉันบอกว่า VM ให้ระบบประเภทถูกถามว่า " ระบบประเภทของคุณคืออะไร " หลังจากตอบฉันได้รับเสียงหัวเราะจากผู้ที่ถามคำถาม

ดังนั้นแม้ว่าฉันเกือบจะเสียชื่อเสียงในการถามคำถามนี้ แต่ฉันกลับไปที่โปรแกรมเมอร์

ความเข้าใจของฉัน

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

ประเภทยังสามารถใช้เพื่อให้ข้อมูลกับโปรแกรมเมอร์มนุษย์เหล่านั้น ตัวอย่างเช่นฉันพบประกาศนี้:

function sqrt(double n) -> double;

มีประโยชน์มากกว่านี้

sqrt(n)

ก่อนหน้านี้ให้ข้อมูลมากมาย: sqrtตัวระบุเป็นฟังก์ชั่นรับdoubleอินพุตหนึ่งตัวและสร้างอีกdoubleอันเป็นเอาต์พุต หลังบอกคุณว่ามันอาจเป็นฟังก์ชั่นการใช้พารามิเตอร์เดียว

คำตอบของฉัน

ดังนั้นหลังจากถูกถามว่า "ระบบประเภทของคุณคืออะไร" ฉันตอบดังนี้:

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

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

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

หลังจากนั้นฉันก็หัวเราะเยาะและคำตอบของฉันก็ถูกไล่ออกพร้อมกับความคิดเห็นที่ว่า "นั่นไม่ใช่ระบบเพลงจริง"

ดังนั้น - ถ้าสิ่งที่ฉันอธิบายไม่ได้ถือว่าเป็น "ระบบที่แท้จริง" สิ่งที่จะได้หรือไม่ บุคคลนั้นถูกต้องหรือไม่ที่สิ่งที่ฉันให้ไม่สามารถพิจารณาว่าเป็นระบบได้หรือไม่


19
เมื่อคนพูดถึงระบบการพิมพ์พวกเขามักจะพูดถึงการพิมพ์แบบคงที่ การพิมพ์แบบไดนามิกไม่น่าสนใจมากสำหรับคนที่ใส่ใจกับระบบการพิมพ์เพราะมันรับประกันแทบไม่มีอะไรเลย เช่นค่าตัวแปรชนิดใดที่สามารถถือ x ได้? สิ่งใด
Doval

7
ฉันอยากรู้อยากเห็นได้ยินสิ่งที่พวกเขาต้องพูดเพื่อปกป้อง / อธิบายปฏิกิริยาของพวกเขา
Newtopian

18
@Doval การพิมพ์แบบไดนามิกสามารถรับประกันได้ว่าคุณจะไม่เข้าสู่สถานะไร้สาระโดยการทำบางอย่างเช่นการเพิ่ม 5 ให้กับแมวของคุณ แน่นอนว่ามันจะไม่ป้องกันคุณจากการพยายามแต่อย่างน้อยก็สามารถหยุดมันไม่ให้เกิดขึ้นจริงและให้โอกาสคุณได้รู้ว่าสิ่งใดผิดพลาดและดำเนินการแก้ไขสิ่งต่าง ๆ ที่ภาษาที่ไม่สามารถพิมพ์ได้อย่างแท้จริงไม่สามารถทำได้
8bittree

10
บุคคลนั้นมีปัญหากับคำตอบของคุณสำหรับ "และประเภทที่กำหนดให้กับค่าเป็นอย่างไร" พวกเขาต้องการได้ยินเกี่ยวกับการพิมพ์กฎไม่ใช่ไดอะแกรมแบบกล่องและตัวชี้ แม้ว่าการหัวเราะนั้นเป็นการหยาบคายอย่างแน่นอน
Gardenhead

10
คนที่หัวเราะเป็นคนที่กระตือรือร้นมากที่สุดสำหรับบางภาษา (ครอบครัว) ที่มีระบบการพิมพ์ที่แข็งแกร่ง (Haskell ดูเหมือนว่าเป็นที่นิยม) และจะเยาะเย้ยอะไรที่แข็งแกร่งน้อยกว่า (และของเล่น) กว่านั้นหรือมากกว่านั้น หรือแตกต่างกันเพียง การมีส่วนร่วมในการสนทนากับ zealots เป็นสิ่งที่อันตรายและไร้ประโยชน์ การหัวเราะอย่างนั้นหยาบคายมากจนบ่งบอกถึงปัญหาที่ลึกซึ้งกว่านี้ คุณโชคดีที่พวกเขาไม่ได้เริ่มต้นเทศน์ ...
hyde

คำตอบ:


30

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

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

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

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


3
"ขึ้นอยู่กับสภาพแวดล้อมของคุณบุคคลนั้นอาจต้องการพิธีการในระบบพิมพ์ของคุณมากขึ้น" นั่นอาจจะเป็น ฉันไม่ได้สนใจสิ่งที่ฉันสามารถพิสูจน์ได้ด้วยระบบพิมพ์ แต่คิดว่ามันเป็นเครื่องมือ ขอบคุณสำหรับคำแนะนำหนังสือ!
Mael

1
@Mael ระบบบางชนิดใช้เป็นโลจิคัล (ดูที่เฟรมเวิร์กแบบลอจิคัล ) ดังนั้นโดยทั่วไปแล้วประเภทจะให้สูตรและโปรแกรมนั้นเป็นบทพิสูจน์ของสูตรเหล่านั้น (เช่นประเภทของฟังก์ชันa -> bสามารถมองเห็นเป็นนัยถึง bได้เช่นถ้าคุณให้ค่าประเภทที่aฉันสามารถรับค่าประเภทได้b) อย่างไรก็ตามการทำเช่นนี้จะต้องสอดคล้องภาษาทั้งหมดและทำให้ไม่ใช่ทัวริง - สมบูรณ์ ดังนั้นระบบประเภทชีวิตจริงทั้งหมดจึงกำหนดตรรกะที่ไม่สอดคล้องกัน
Bakuriu

20

ฉันชอบคำตอบของ @ Telastyn โดยเฉพาะอย่างยิ่งเนื่องจากมีการอ้างอิงถึงความสนใจด้านวิชาการในพิธีการ

อนุญาตให้ฉันเพิ่มในการสนทนา

ระบบประเภทคืออะไร?

ระบบชนิดเป็นกลไกสำหรับการกำหนดตรวจจับและป้องกันสถานะโปรแกรมที่ผิดกฎหมาย มันทำงานได้โดยการกำหนดและใช้ข้อ จำกัด คำจำกัดความของข้อ จำกัด คือประเภทและแอปพลิเคชั่นข้อ จำกัด คือการใช้ประโยชน์ของประเภทเช่นในการประกาศตัวแปร

โดยทั่วไปคำจำกัดความประเภทจะรองรับตัวดำเนินการจัดองค์ประกอบ (เช่นรูปแบบต่างๆของการรวมกันเช่นในโครงสร้างการทำคลาสย่อยและการแยกความแตกต่างเช่นใน enums สหภาพ)

ข้อ จำกัด การใช้งานของประเภทบางครั้งก็อนุญาตให้ผู้ประกอบการแต่งเพลง (เช่นอย่างน้อยนี้ตรงนี้อย่างนี้หรือว่านี้หากสิ่งอื่นถือ)

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

(ระบบแบบสแตติกหยุดโปรแกรมไม่ให้รันหรือไม่รู้จัก (หรือ undecidable) ว่าโปรแกรมจะไปถึงโค้ดที่ไม่ได้มีเสียงดังที่มันบ่นเกี่ยวกับระบบชนิดสแตติกจะตรวจจับเรื่องไร้สาระบางอย่าง และตัดสินว่าโปรแกรมผิดพลาดก่อนที่จะรัน)

หากระบบประเภทถูกนำไปใช้ที่รันไทม์มันเป็นระบบประเภทแบบไดนามิกที่ป้องกันสถานะของโปรแกรมที่ผิดกฎหมาย: แต่โดยการหยุดโปรแกรมในช่วงกลางรันแทนที่จะป้องกันไม่ให้ทำงานในสถานที่แรก

ระบบการพิมพ์ที่ใช้กันทั่วไปนั้นมีให้ทั้งคุณสมบัติคงที่และไดนามิก


ฉันไม่คิดว่าระบบประเภทไฮบริดเรียกว่าเป็นเรื่องธรรมดามากเลย คุณมีภาษาอะไรในใจ?
Gardenhead

2
@gardenhead ความสามารถในการดาวน์สตรีมไม่ใช่คุณสมบัติระบบสแตติกชนิดดังนั้นจึงมักถูกตรวจสอบที่รันไทม์แบบไดนามิก
Erik Eidt

1
@gardenhead: ภาษาที่พิมพ์แบบสแตติกส่วนใหญ่อนุญาตให้คุณเลื่อนการพิมพ์ไปยังรันไทม์ไม่ว่าจะด้วยพvoid *อยน์เตอร์ของ C (อ่อนแอมาก), วัตถุไดนามิกของ C # หรือ HADS GADTs เชิงปริมาณที่มีอยู่จริงของ Haskell ภาษา)
leftaroundabout

จริงฉันลืมเรื่อง "แคสติ้ง" แต่การคัดเลือกนักแสดงเป็นเพียงไม้ยันรักแร้สำหรับระบบที่อ่อนแอ
Gardenhead

@gardenhead เช่นเดียวกับภาษาแบบคงที่ให้ตัวเลือกแบบไดนามิกภาษาแบบไดนามิกจำนวนมากให้การพิมพ์แบบคงที่ ตัวอย่างเช่น Dart, Python และแฮ็กทุกคนมีโหมดหรือเครื่องมือสำหรับการวิเคราะห์แบบสแตติกตามแนวคิดของ "การพิมพ์ทีละส่วน"
IMSoP

14

โอ้มนุษย์ฉันตื่นเต้นที่จะพยายามตอบคำถามนี้ให้ดีที่สุดเท่าที่จะทำได้ ฉันหวังว่าฉันจะได้รับความคิดของฉันตามลำดับ

ดังที่ @Doval พูดถึงและผู้ถามชี้ให้เห็น (ถึงแม้จะหยาบคาย) คุณไม่มีระบบการพิมพ์จริงๆ คุณมีระบบการตรวจสอบแบบไดนามิกโดยใช้แท็กซึ่งโดยทั่วไปอ่อนแอกว่าและน่าสนใจน้อยกว่ามาก

คำถามที่ว่า "ระบบการพิมพ์แบบใด" นั้นเป็นปรัชญาค่อนข้างมากและเราสามารถเติมหนังสือที่มีมุมมองที่แตกต่างกันในเรื่องนี้ อย่างไรก็ตามเนื่องจากเป็นเว็บไซต์สำหรับโปรแกรมเมอร์ฉันจะพยายามทำให้คำตอบของฉันเป็นจริงที่สุดเท่าที่จะเป็นไปได้ (และจริงๆแล้วประเภทต่างๆนั้นเป็นประโยชน์อย่างมากในการเขียนโปรแกรม

ภาพรวม

เรามาเริ่มกันที่ที่นั่งของกางเกงเข้าใจว่าระบบแบบไหนดีก่อนที่จะดำดิ่งลงสู่ใต้กางเกงที่เป็นทางการ ระบบประเภทกำหนดโครงสร้างในโปรแกรมของเรา พวกเขาบอกเราว่าเราจะเสียบฟังก์ชั่นและการแสดงออกต่างๆเข้าด้วยกันได้อย่างไร หากไม่มีโครงสร้างโปรแกรมจะไม่สามารถป้องกันได้และซับซ้อนอย่างมากพร้อมที่จะก่อให้เกิดอันตรายในความผิดพลาดเพียงเล็กน้อยของโปรแกรมเมอร์

การเขียนโปรแกรมด้วยระบบพิมพ์ก็เหมือนกับการดูแลเอาใจใส่ในสภาพที่ไม่ดี - เบรกทำงานประตูปิดอย่างปลอดภัยเครื่องยนต์ถูกทาน้ำมัน ฯลฯ โปรแกรมการเขียนที่ไม่มีระบบพิมพ์ก็เหมือนกับการปั่นจักรยานโดยไม่มีหมวกและมีล้อทำ สปาเก็ตตี้ออกมา คุณไม่สามารถควบคุมได้อย่างแน่นอน

สมมติว่าเรามีภาษาที่มีการแสดงออกตามตัวอักษรnum[n]และstr[s]นั่นแทนตัวเลข n และสตริง s ตามลำดับและฟังก์ชันดั้งเดิมplusและconcatด้วยความหมายที่ตั้งใจไว้ เห็นได้ชัดว่าคุณไม่ต้องการที่จะสามารถที่จะเขียนสิ่งที่ต้องการหรือplus "hello" "world" concat 2 4แต่เราจะป้องกันได้อย่างไร เบื้องต้นไม่มีวิธีแยกแยะตัวเลข 2 จาก "โลก" ของสตริงตามตัวอักษร สิ่งที่เราอยากจะพูดคือการแสดงออกเหล่านี้ควรใช้ในบริบทที่แตกต่างกัน พวกเขามีประเภทที่แตกต่างกัน

ภาษาและประเภท

ลองย้อนกลับไปหน่อย: ภาษาโปรแกรมคืออะไร? โดยทั่วไปเราสามารถแบ่งภาษาโปรแกรมออกเป็นสองเลเยอร์: ไวยากรณ์และซีแมนทิกส์ สิ่งเหล่านี้เรียกว่าสถิตยศาสตร์และพลศาสตร์ตามลำดับ ปรากฎว่าระบบประเภทที่จำเป็นในการเป็นสื่อกลางในการปฏิสัมพันธ์ระหว่างสองส่วนนี้

วากยสัมพันธ์

โปรแกรมเป็นต้นไม้ อย่าหลงกลตามบรรทัดของข้อความที่คุณเขียนบนคอมพิวเตอร์ นี่เป็นเพียงการนำเสนอของโปรแกรมที่มนุษย์อ่านได้ ตัวโปรแกรมเองเป็นนามธรรมต้นไม้ไวยากรณ์ ตัวอย่างเช่นใน C เราอาจเขียน:

int square(int x) { 
    return x * x;
 }

นั่นคือไวยากรณ์ที่เป็นรูปธรรมสำหรับโปรแกรม (แฟรกเมนต์) ตัวแทนต้นไม้คือ:

     function square
     /     |       \
   int   int x    return
                     |
                   times
                  /    \
                 x      x

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

อรรถศาสตร์

ตกลงเรารู้ว่าโปรแกรมคืออะไร แต่มันเป็นเพียงโครงสร้างต้นไม้แบบคงที่ สมมุติว่าเราต้องการให้โปรแกรมของเราคำนวณบางสิ่งบางอย่าง เราต้องการความหมาย

ความหมายของภาษาโปรแกรมเป็นเขตการศึกษาที่หลากหลาย พูดกว้างมีสองวิธี: ความหมาย denotationalและความหมายในการดำเนินงาน ความหมายเชิง Denotational อธิบายโปรแกรมโดยการจับคู่มันเข้าไปในโครงสร้างทางคณิตศาสตร์พื้นฐานบางอย่าง (เช่นจำนวนธรรมชาติ, ฟังก์ชันต่อเนื่องเป็นต้น) ที่ให้ความหมายกับโปรแกรมของเรา ในทางตรงกันข้ามความหมายในการปฏิบัติงานจะกำหนดโปรแกรมโดยรายละเอียดวิธีการใช้งาน ในความคิดของฉันความหมายในการปฏิบัติงานนั้นง่ายต่อการเขียนโปรแกรม

ฉันจะไม่อธิบายวิธีการกำหนด semantics อย่างเป็นทางการ (รายละเอียดเกี่ยวข้องเล็กน้อย) แต่โดยพื้นฐานแล้วเราต้องการกฎดังนี้:

  1. num[n] เป็นค่า
  2. str[s] เป็นค่า
  3. ถ้าnum[n1]และnum[n2]ประเมินค่าเป็นจำนวนเต็มn_1$ and $n_2$, thenบวก (num [n1], NUM [n2]) `ประเมินเป็นจำนวนเต็ม $ n_1 + n_2 $
  4. ถ้าstr[s1]และstr[s2]ประเมินสตริง s1 และ s2 ให้concat(str[s1], str[s2])ประเมินสตริง s1s2

ฯลฯ กฎในทางปฏิบัติมากขึ้นอย่างเป็นทางการ แต่คุณได้รับส่วนสำคัญ อย่างไรก็ตามเราพบปัญหาในไม่ช้า จะเกิดอะไรขึ้นเมื่อเราเขียนสิ่งต่อไปนี้:

concat(num[5], str[hello])

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

ประเภท

โปรแกรมเป็นต้นไม้ตามที่กำหนดโดยไวยากรณ์ของภาษา โปรแกรมได้รับความหมายตามกฎการดำเนินการ แต่บางโปรแกรมไม่สามารถดำเนินการได้ ว่ามีบางโปรแกรมมีความหมาย โปรแกรมเหล่านี้ไม่ถูกต้อง ดังนั้นการพิมพ์ลักษณะของโปรแกรมที่มีความหมายในภาษา หากโปรแกรมถูกพิมพ์อย่างดีเราสามารถเรียกใช้งานได้

ลองยกตัวอย่างบางส่วน อีกครั้งเช่นเดียวกับกฎการประเมินผลฉันจะแสดงกฎการพิมพ์อย่างไม่เป็นทางการ แต่สามารถทำได้อย่างเข้มงวด นี่คือกฎบางอย่าง:

  1. โทเค็นของแบบฟอร์มมีประเภทnum[n]nat
  2. โทเค็นของแบบฟอร์มมีประเภทstr[s]str
  3. หากการแสดงออกe1มีพิมพ์natและการแสดงออกe2มีประเภทnatแล้วแสดงออกได้พิมพ์plus(e1, e2)nat
  4. หากการแสดงออกe1มีพิมพ์strและการแสดงออกe2มีประเภทstrแล้วแสดงออกได้พิมพ์concat(e1, e2)str

ดังนั้นตามกฎเหล่านี้มีplus(num[5], num[2])อยู่ในประเภทมีแต่เราไม่สามารถกำหนดประเภทให้nat plus(num[5], str["hello"])เราบอกว่าโปรแกรม (หรือนิพจน์) นั้นถูกพิมพ์อย่างดีถ้าเราสามารถกำหนดมันให้เป็นประเภทใดก็ได้และมันก็พิมพ์ผิดไป ระบบประเภทจะมีเสียงถ้าโปรแกรมที่พิมพ์ได้ดีทั้งหมดสามารถดำเนินการได้ Haskell เป็นเสียง C ไม่ได้

ข้อสรุป

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


4
+1 เคล็ดลับที่ยิ่งใหญ่ที่สุดสำหรับผู้ที่ชื่นชอบการพิมพ์แบบไดนามิกที่เคยสร้างความเชื่อมั่นให้กับโลกที่คุณมี "ประเภท" โดยไม่มีระบบการพิมพ์ :-)
ruakh

1
เนื่องจากคุณไม่สามารถตรวจสอบสิ่งที่น่าสนใจสำหรับโปรแกรมเองได้โดยอัตโนมัติระบบทุกประเภทจะต้องให้บริการตัวดำเนินการร่าย (หรือเทียบเท่าทางศีลธรรม) ซึ่งรวมถึง Haskellแน่นอน
เควิน

1
@ เควินฉันรู้ดีเกี่ยวกับทฤษฎีบทของไรซ์ แต่ก็ไม่เกี่ยวข้องเท่าที่ควร ในการเริ่มต้นโปรแกรมส่วนใหญ่ไม่จำเป็นต้องมีการสอบถามซ้ำ ๆ มากมาย หากเราทำงานในภาษาที่มีการเรียกซ้ำแบบดั้งเดิมเช่น System T ของ Godel เท่านั้นเราสามารถตรวจสอบคุณสมบัติที่น่าสนใจโดยใช้ระบบพิมพ์รวมถึงการหยุดพัก โปรแกรมส่วนใหญ่ในโลกแห่งความเป็นจริงนั้นค่อนข้างเรียบง่าย - ฉันไม่สามารถนึกถึงครั้งสุดท้ายที่ฉันต้องการหล่อจริงๆ ทัวริงสมบูรณ์เป็น overrated
Gardenhead

9
“ การพิมพ์แบบไดนามิกไม่ได้พิมพ์จริงๆ” ดูเหมือนว่าฉันมักจะชอบนักดนตรีคลาสสิกที่พูดว่า "เพลงป๊อปไม่ใช่เพลงจริง ๆ " หรือ Evangelicals ที่พูดว่า "ชาวคาทอลิกไม่ใช่คริสเตียนจริงๆ" ใช่ระบบพิมพ์แบบคงที่มีประสิทธิภาพและน่าสนใจและสำคัญและการพิมพ์แบบไดนามิกเป็นสิ่งที่แตกต่าง แต่ (ตามคำตอบอื่น ๆ อธิบาย) มีช่วงของสิ่งที่มีประโยชน์นอกเหนือจากระบบสแตติกชนิดที่เรียกว่าการพิมพ์แบบดั้งเดิมและที่ทุกคนร่วมกันที่สำคัญร่วมกัน ทำไมต้องยืนยันพิมพ์ดีดของเราเป็นพิมพ์ดีดที่แท้จริงหนึ่ง
Peter LeFanu Lumsdaine

5
@IMSoP: สำหรับบางสิ่งบางอย่างที่สั้นกว่าหนังสือบทความเรียงความของ Chris Smith สิ่งที่ควรรู้ก่อนการโต้วาทีระบบการพิมพ์นั้นดีเยี่ยม
Peter LeFanu Lumsdaine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.