การอนุมานประเภทสำหรับคำสั่งที่จำเป็นนอกเหนือจากที่ได้รับมอบหมาย


10

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

ดังนั้นจึงไม่มีความชัดเจนว่าภาษาที่จำเป็นกับการอนุมานบางส่วนเช่นhttp://rust-lang.orgสามารถนำไปใช้ได้อย่างไร

เอกสารไม่ได้กล่าวถึงประเภท parametrized เช่นList of aเนื่องจากประเภท parametrized เป็นส่วนขยายเล็กน้อยของระบบประเภท Hindley-Milner - อัลกอริทึมการรวมควรจะขยายและการอนุมานที่เหลือทำงานตามที่เป็นอยู่ อย่างไรก็ตามไม่สามารถเพิ่มงานที่มอบหมายได้เนื่องจากความขัดแย้งเกิดขึ้นดังนั้นต้องใช้เทคนิคพิเศษเช่นข้อ จำกัด ค่า ML

คุณสามารถแนะนำเอกสารหรือหนังสือที่อธิบายถึงระบบการพิมพ์สำหรับภาษาที่มีลูปคำสั่งเงื่อนไขเงื่อนไข IO และคำสั่งผสมได้หรือไม่?


4
ผมไม่แน่ใจว่าผมเข้าใจที่มาของคำถามของคุณไม่สมบูรณ์เพราะมาตรฐาน ML จริงมีผู้ประกอบการผสมลูปและเงื่อนไข (ตัวอย่างเช่นบรรทัดที่หนึ่ง: let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end) ดังนั้นในระดับของคำถามการวิจัยคำตอบที่คุณกำลังมองหาคือ "ใช้เทคนิคที่พัฒนาขึ้นใน Caml / SML รวมถึงข้อ จำกัด ของค่า"
Rob Simmons

คำถามคือ "คุณแนะนำเอกสารใดเกี่ยวกับเทคนิคที่พัฒนาขึ้นสำหรับ Caml / SML"
nponeccop

ตกลง - ฉันเข้าใจแล้วและกำลังพยายามแก้ไขประโยคสุดท้ายของฉันเพื่อพูดว่า "คุณกำลังมองหาข้อมูลอ้างอิงที่สามารถเข้าถึงได้สำหรับการอนุมานประเภท Hindley-Milner ตามที่ใช้ใน ML หรือไม่" จากนั้นฉันถึงขีด จำกัด การแก้ไข 5 นาที :-)
Rob Simmons

คำตอบ:


14

หากคุณกำลังมองหาการอ้างอิงที่เป็นระเบียบและใช้งานได้กับการอนุมานประเภทฉันมีบางส่วนเกี่ยวกับ Gundry, McBride และ McKinna ในปี 2010 " การอนุมานในบริบท " ของ McKinna แม้ว่านี่อาจไม่ใช่แนวทางที่ดีในการนำไปใช้จริง .

ฉันคิดว่าส่วนหนึ่งของคำตอบก็คือนอกเหนือจากข้อ จำกัด ด้านคุณค่าแล้วมันมีความยากลำบากไม่มากที่จะปรับการอนุมานประเภท Hindley-Milner เป็นภาษาที่จำเป็น: ถ้าคุณกำหนดe1; e2ว่าน้ำตาล syntactic สำหรับ(fn _ => e2) e1และกำหนดwhile e1 do e2เป็นน้ำตาล syntactic สำหรับwhiledo e1 (fn () => e2)ซึ่งwhiledoเป็นปกติ ฟังก์ชั่นซ้ำ

fun whiledo g f = if g then (f (); whiledo g f) else ();

จากนั้นทุกอย่างจะทำงานได้ดีรวมถึงการอนุมานประเภท

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

let
   val x: 'a option ref = ref NONE
in
   (x := SOME 5; x := SOME "Hello")  
end

เปรียบเทียบกับรหัสต่อไปนี้ซึ่งไม่มีปัญหาโดยสิ้นเชิง:

let
   val x: unit -> 'a option ref = fn () => ref NONE
in
   (x () := SOME 5; x () := SOME "Hello")  
end

เรารู้ว่าตัวอย่างที่สองทำอะไร: มันสร้างเซลล์อ้างอิงใหม่สองเซลล์ที่มีอยู่NONEจากนั้นใส่เซลล์SOME 5แรก (หนึ่งint option ref) จากนั้นใส่เซลล์ที่SOME "Hello"สอง (หนึ่งstring option ref)

xxα.ref(option(α))xΛα.ref[α](NONE)

สิ่งนี้จะแนะนำว่าพฤติกรรม "ดี" ของตัวอย่างแรกคือการทำงานในลักษณะเดียวกับตัวอย่างที่สอง - ยกตัวอย่างแลมบ์ดาระดับประเภทสองครั้งที่แตกต่างกัน ครั้งแรกที่เรายกตัวอย่างxด้วยintซึ่งจะทำให้x [int]ในการประเมินการถือครองเซลล์อ้างอิงแล้วNONE SOME 5เป็นครั้งที่สองที่เรายกตัวอย่างxด้วยstringซึ่งจะเป็นกรณีที่x [string]ในการประเมินไป ( ! ที่แตกต่างกัน ) โฮลดิ้งถืออ้างอิงแล้วNONE SOME "Hello"ลักษณะการทำงานนี้ "ถูกต้อง" (ชนิดปลอดภัย) แต่ไม่ใช่สิ่งที่โปรแกรมเมอร์คาดหวังและนี่คือสาเหตุที่เรามีข้อ จำกัด ค่าใน ML เพื่อหลีกเลี่ยงโปรแกรมเมอร์ที่จัดการกับพฤติกรรมที่ไม่คาดคิดนี้


1
เวอร์ชันที่ต้องการของคุณe1; e2มีวงเล็บที่ไม่ตรงกันและเซมิโคลอน (ซึ่งควรจะกำหนด) คุณหมายถึง(fn _ => e2) e1อะไร
Tsuyoshi Ito

ถูกต้อง, Tsuyoshi: แก้ไขแล้ว
Rob Simmons

ย่อหน้าสุดท้ายของคุณบอกว่า: ซีแมนทิกส์ (ปฏิบัติการ) และระบบพิมพ์ไม่ตรงกันต้องมีการแก้ไขและเราเลือกที่จะแก้ไขหลัง
Radu GRIGore

Radu: แน่นอนฉันเห็นด้วยกับบทสรุปนั้น
Rob Simmons

3

วิทยานิพนธ์ปริญญาเอกของซาเวียร์เลอรอยเป็นจุดเริ่มต้นที่ดี


1
วิทยานิพนธ์ไม่ครอบคลุมลูปคำสั่งเงื่อนไขเงื่อนไข IO และคำสั่งผสมใช่ไหม? เหตุผลหลักสำหรับคำถามของฉันคือฉันไม่พบเอกสารที่ครอบคลุมหัวข้อเหล่านี้ บทความเกี่ยวกับการพิมพ์ที่ได้รับมอบหมายมีมากมาย
nponeccop

0

ฉันขอโทษสำหรับการตอบคำถามของฉันเอง แต่การอ้างอิงในคำถามคือ

ข้อเสนอสำหรับ ML มาตรฐาน , Milner, 1983

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

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