2010-09-15 31 views

Trả lời

20

ML đang tĩnh đánh máy, vì vậy nó không thể cho một cái gì đó để có các loại khác nhau vào những thời điểm khác nhau. x đôi khi không thể có loại int và vào các thời điểm khác có loại string. Nếu bạn cần cư xử như thế này, theo cách thông thường để đi về nó là để bọc các giá trị trong một container mã hóa gõ thông tin, như:

datatype wrapper = Int of int | Real of real | String of string 

Sau đó, bạn có thể mô hình trận đấu trên constructor:

case x of Int x -> foo 
     | Real x -> bar 
     | String x -> ... 

Trong trường hợp này, x được nhập rõ ràng là wrapper, do đó sẽ hoạt động.

8

Không thể thực hiện những gì bạn muốn nói chung, ngay cả khi x là loại đa hình (không tự làm gói như Chuck gợi ý).

Đây là quyết định thiết kế có chủ ý; nó làm cho nó có thể đưa ra kết luận rất mạnh về các chức năng, chỉ dựa trên các loại của chúng, mà bạn không thể làm khác được. Ví dụ, nó cho phép bạn nói rằng một hàm có kiểu 'a -> 'a phải là hàm nhận dạng (hoặc một hàm luôn ném ra một ngoại lệ hoặc hàm không bao giờ trả về). Nếu bạn có thể kiểm tra xem 'a là gì khi chạy, bạn có thể viết một chương trình lén lút như

fun sneaky (x : 'a) : 'a = if x = int then infinite_loop() else x 

sẽ vi phạm quy tắc. (Đây là một ví dụ khá tầm thường, nhưng có rất nhiều điều nhỏ nhặt bạn có thể làm khi biết hệ thống kiểu của bạn có thuộc tính này.)

Các vấn đề liên quan