Gõ suy luận cho các mệnh lệnh mệnh lệnh khác với phép gán


10

Trong quá trình tìm kiếm tài liệu nghiên cứu về các hệ thống loại cho các ngôn ngữ mệnh lệnh, tôi chỉ tìm giải pháp cho một ngôn ngữ có các tham chiếu có thể thay đổi nhưng không có cấu trúc điều khiển mệnh lệnh thực sự như toán tử ghép, vòng lặp hoặc điều kiện.

Vì vậy, không rõ làm thế nào một ngôn ngữ bắt buộc với suy luận kiểu một phần như http://rust-lang.org có thể được thực hiện.

Các bài báo không đề cập đến các loại tham số hóa như List of abởi vì các loại tham số là một phần mở rộng tầm thường của hệ thống loại Hindley-Milner - chỉ nên mở rộng thuật toán hợp nhất và phần còn lại của suy luận hoạt động. Tuy nhiên, các bài tập không thể được thêm vào một cách tầm thường vì các nghịch lý phát sinh, do đó các kỹ thuật đặc biệt như hạn chế giá trị ML phải được áp dụng.

Bạn có thể giới thiệu bất kỳ giấy tờ hoặc sách mô tả một hệ thống loại cho một ngôn ngữ với các vòng lặp bắt buộc, điều kiện, IO và các câu lệnh ghép không?


4
Tôi không chắc là tôi hiểu nguồn gốc câu hỏi của bạn, một phần vì ML thực sự có các toán tử hỗn hợp, các vòng lặp và các điều kiện (ví dụ một dòng let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end:). Vì vậy, ở cấp độ của một câu hỏi nghiên cứu, câu trả lời bạn đang tìm kiếm "áp dụng các kỹ thuật được phát triển trong Caml / SML, bao gồm cả hạn chế giá trị"?
Rob Simmons

Câu hỏi đặt ra là "bạn đề xuất những bài báo nào về các kỹ thuật được phát triển cho Caml / SML?"
nponeccop

Ok - Tôi đã tìm ra điều đó và chuẩn bị chỉnh sửa câu cuối cùng của mình để nói "Có phải bạn đang tìm kiếm một tài liệu tham khảo có thể truy cập được cho suy luận kiểu Hindley-Milner khi nó được sử dụng trong ML?" Và sau đó tôi đạt giới hạn chỉnh sửa trong 5 phút :-)
Rob Simmons

Câu trả lời:


14

Nếu bạn đang tìm kiếm một tài liệu tham khảo gọn gàng, đầy đủ chức năng cho suy luận kiểu, thì tôi là một phần của " Kiểu suy luận trong ngữ cảnh " của Gundry, McBride và 2010 của McKinna , mặc dù điều này có thể không phải là một hướng dẫn tốt cho bất kỳ triển khai thực tế hiện có nào .

Tôi nghĩ một phần của câu trả lời là, ngoài giới hạn giá trị, thực sự không có quá nhiều khó khăn để thích ứng kiểu suy luận của Hindley-Milner với các ngôn ngữ bắt buộc: nếu bạn định nghĩa e1; e2là đường cú pháp (fn _ => e2) e1và định nghĩa while e1 do e2là đường cú pháp whiledo e1 (fn () => e2), thì đâu whiledolà thông thường Hàm đệ quy

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

sau đó mọi thứ sẽ hoạt động tốt, bao gồm cả suy luận kiểu.

Đối với việc hạn chế giá trị là một kỹ thuật đặc biệt, tôi thích câu chuyện sau đây; Tôi khá chắc chắn rằng tôi đã nhặt nó từ Karl Crary. Xem xét mã sau đây, hạn chế giá trị sẽ ngăn bạn viết bằng ML:

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

So sánh nó với mã sau đây, điều này hoàn toàn không có gì khó hiểu:

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

Chúng ta biết ví dụ thứ hai làm gì: nó tạo ra hai ô ref mới chứa NONE, sau đó đặt SOME 5vào ô thứ nhất (an int option ref), sau đó đặt SOME "Hello"vào ô thứ hai (a string option ref).

xxα.tham chiếu(Lựa chọn(α))xΛα.tham chiếu[α](KHÔNG AI)

Điều này sẽ gợi ý rằng một hành vi "tốt" của ví dụ đầu tiên là hành xử chính xác giống như cách mà ví dụ thứ hai hành xử - khởi tạo lambda cấp độ hai lần khác nhau. Lần đầu tiên chúng ta khởi tạo xvới int, điều này sẽ gây ra x [int]việc đánh giá một ô tham chiếu NONEvà sau đó SOME 5. Lần thứ hai chúng tôi khởi tạo xvới string, trường hợp này sẽ x [string]đánh giá một ô tham chiếu ( khác! ) NONEVà sau đó SOME "Hello". Hành vi này là "chính xác" (loại an toàn), nhưng chắc chắn đó không phải là điều mà lập trình viên mong đợi và đây là lý do tại sao chúng tôi có giới hạn giá trị trong ML, để tránh các lập trình viên xử lý loại hành vi bất ngờ này.


1
Phiên bản tuyệt vọng của bạn e1; e2chứa dấu ngoặc đơn không khớp và dấu chấm phẩy (mà nó được cho là xác định). Ý bạn là (fn _ => e2) e1sao
Tsuyoshi Ito

Phải-o, Tsuyoshi: đã sửa.
Rob Simmons

Đoạn cuối của bạn về cơ bản nói: ngữ nghĩa (hoạt động) và hệ thống loại không khớp, một cái cần được sửa và chúng tôi chọn sửa cái sau.
Radu GRIGore

Radu: chắc chắn, tôi đồng ý với tóm tắt đó.
Rob Simmons

3

Luận án tiến sĩ của Xavier Leroy là một khởi đầu tốt.


1
Luận án không bao gồm các vòng lặp bắt buộc, điều kiện, IO và các câu lệnh ghép, phải không? Lý do chính cho câu hỏi của tôi là tôi không thể tìm thấy các bài viết về các chủ đề này. Giấy tờ về bài tập đánh máy là phong phú.
nponeccop

0

Tôi xin lỗi vì đã thu thập câu hỏi của riêng tôi, nhưng tài liệu tham khảo trong câu hỏi là

Đề xuất cho ML tiêu chuẩn , Milner, 1983

Phần 6 "Các hình thức phái sinh tiêu chuẩn" bao gồm việc giải thích các cấu trúc mệnh lệnh khá rộng rãi. Và cho đến nay, đây là tài liệu tham khảo sớm nhất về những biến đổi phần lớn rõ ràng mà tôi có thể tìm thấy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.