ฉันกำลังทำงานกับคอมไพเลอร์สำหรับภาษาที่ต่อกันและต้องการเพิ่มการสนับสนุนการอนุมานประเภท ฉันเข้าใจ Hindley - Milner แต่ฉันได้เรียนรู้ทฤษฎีประเภทเมื่อฉันไปดังนั้นฉันไม่แน่ใจว่าจะปรับตัวอย่างไร ระบบต่อไปนี้เป็นระบบเสียงที่ดี
คำคือตัวอักษรองค์ประกอบของคำพูดคำพูดของคำหรือดั้งเดิม
เงื่อนไขทั้งหมดแสดงถึงฟังก์ชั่น สำหรับสองฟังก์ชั่นและ ,นั่นคือ juxtaposition แสดงถึงการจัดองค์ประกอบย้อนกลับ ตัวอักษรหมายถึงฟังก์ชั่น niladice 2
คำอื่น ๆ นอกเหนือจากการแต่งมีกฎประเภทพื้นฐาน:
ไม่มีกฎระเบียบสำหรับการประยุกต์ใช้สะดุดตาเนื่องจากภาษาที่เรียงต่อกันขาด
ประเภทคือตัวอักษรตัวแปรประเภทหรือฟังก์ชั่นจากสแต็คไปสแต็คที่สแต็กจะถูกกำหนดเป็น tuple ที่ซ้อนกันขวา ฟังก์ชั่นทั้งหมดมีความหลากหลายโดยนัยเกี่ยวกับ "ส่วนที่เหลือของสแต็ค"
นี่เป็นสิ่งแรกที่ดูเหมือนผู้ต้องสงสัย แต่ฉันไม่รู้แน่ชัดว่าเกิดอะไรขึ้นกับมัน
เพื่อช่วยให้สามารถอ่านและลดวงเล็บได้ฉันจะสมมติว่าในแบบแผนชุด ฉันจะใช้อักษรตัวใหญ่สำหรับตัวแปรที่แสดงถึงสแต็กแทนที่จะเป็นค่าเดียว
มีหกดั้งเดิม ห้าคนแรกนั้นไม่น่ากลัวเลย dupใช้ค่าสูงสุดและสร้างสำเนาสองชุด swapเปลี่ยนลำดับของค่าสองอันดับแรก popทิ้งค่าบนสุด quoteรับค่าและสร้างใบเสนอราคา (ฟังก์ชัน) ที่ส่งคืน applyใช้ใบเสนอราคากับสแต็ก
Combinator ที่ผ่านมาcomposeควรจะใช้เวลาสองใบเสนอราคาและผลตอบแทนประเภทของการเรียงต่อกันของพวกเขานั่นคือe_2] ในภาษาที่เรียงต่อกันแบบคงที่ประเภทของแมวนั้นตรงไปตรงมามากcompose
อย่างไรก็ตามประเภทนี้มีข้อ จำกัด เกินไป: มันต้องการให้การผลิตของฟังก์ชั่นแรกตรงกับการบริโภคของที่สอง ในความเป็นจริงคุณต้องสมมติประเภทที่แตกต่างจากนั้นรวมเข้าด้วยกัน แต่คุณจะเขียนประเภทนั้นได้อย่างไร
หากคุณให้แสดงถึงความแตกต่างของสองประเภทฉันคิดว่าคุณสามารถเขียนประเภทได้อย่างถูกต้องcompose
นี้ยังคงค่อนข้างตรงไปตรงมา: composeใช้ฟังก์ชั่นและE ผลกินมันยอดการบริโภคของไม่ได้ผลิตโดยและผลิตบนยอดการผลิตของไม่บริโภคโดยF_2สิ่งนี้ให้กฎสำหรับการแต่งเพลงธรรมดาf 2 : D → E B f 2 f 1 D f 1 f 2
อย่างไรก็ตามฉันไม่รู้ว่าสมมุติฐานนี้สอดคล้องกับอะไรจริง ๆ และฉันก็ไล่ตามมันไปเป็นวงกลมนานพอที่ฉันคิดว่าฉันเลี้ยวผิด มันเป็นความแตกต่างง่ายๆของ tuples ไหม?
มีบางสิ่งที่แตกสลายอย่างมากเกี่ยวกับเรื่องนี้ที่ฉันไม่เห็นหรือว่าฉันชอบเส้นทางที่ถูกต้อง? (ฉันอาจบอกปริมาณของสิ่งนี้ผิดและชื่นชมการแก้ไขในพื้นที่นั้นด้วย)
composeเข้มงวดเกินไป? ฉันมีความประทับใจว่านี่เป็นแบบนี้ (เช่นข้อ จำกัดสามารถจัดการได้โดยการรวมเช่นสำหรับการใช้งานเช่นใน
twiceกำหนดเป็นdup compose applyซึ่งใช้คำพูดและใช้มันสองครั้ง [1 +] twiceเป็นเรื่องปกติ: คุณเขียนสองฟังก์ชั่นประเภท\แต่ไม่ใช่: ถ้า , ปัญหาคือดังนั้นการแสดงออกจึงไม่ได้รับอนุญาตแม้ว่ามันจะถูกต้องและมี พิมพ์A แน่นอนว่าวิธีแก้ปัญหาคือการวางผู้คัดเลือกไว้ในตำแหน่งที่ถูกต้อง แต่ส่วนใหญ่ฉันสงสัยว่าวิธีการเขียนประเภทของจริงโดยไม่มีคำจำกัดความวงกลม ∀ ข[pop] twiceA ≠ A∀ A b .compose