ฉันกำลังทำงานกับคอมไพเลอร์สำหรับภาษาที่ต่อกันและต้องการเพิ่มการสนับสนุนการอนุมานประเภท ฉันเข้าใจ 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] twice
A ≠ A∀ A b .compose