Tôi đang làm việc trên một ngôn ngữ dựa trên biểu thức của phả hệ ML, vì vậy nó tự nhiên cần loại suy luận> :)
Bây giờ, tôi đang cố gắng mở rộng một giải pháp dựa trên ràng buộc cho vấn đề suy ra các loại, dựa trên một triển khai đơn giản trong EOPL (Friedman và Wand), nhưng chúng là các kiểu dữ liệu đại số bước bên thanh lịch.
Những gì tôi có cho đến nay hoạt động trơn tru; nếu một biểu thức e
là a + b
, e : Int
, a : Int
và b : Int
. Nếu e
là một trận đấu,
match n with
| 0 -> 1
| n' -> n' * fac(n - 1)`,
Tôi một cách đúng đắn có thể suy ra rằng t(e) = t(the whole match expression)
, t(n) = t(0) = t(n')
, t(match) = t(1) = t(n' * fac(n - 1)
và vân vân ...
Nhưng tôi rất không chắc chắn khi nói đến các kiểu dữ liệu đại số. Giả sử một chức năng như bộ lọc:
let filter pred list =
match list with
| Empty -> Empty
| Cons(e, ls') when pred e -> Cons (e, filter ls')
| Cons(_, ls') -> filter
Để loại danh sách duy trì đa hình, Nhược điểm cần phải là loại a * a list -> a list
. Vì vậy, trong việc xây dựng những khó khăn này, tôi rõ ràng là cần phải nhìn lên các loại nhà xây dựng đại số của tôi - vấn đề bây giờ tôi có là 'bối cảnh nhạy cảm' của nhiều công dụng của nhà xây dựng đại số - làm thế nào để thể hiện trong các phương trình khó khăn của tôi rằng a
trong mỗi trường hợp cần giống nhau?
Tôi gặp khó khăn khi tìm một giải pháp chung cho vấn đề này, và tôi không thể tìm thấy nhiều tài liệu về điều này. Bất cứ khi nào tôi tìm thấy một cái gì đó tương tự - ngôn ngữ dựa trên biểu thức với suy luận kiểu dựa trên ràng buộc - chúng chỉ dừng lại ở kiểu dữ liệu đại số và đa hình.
Bất kỳ đầu vào được nhiều đánh giá cao!