2014-11-07 27 views
5

Cho một chữ ký A với một datatype t, nóiLàm thế nào để tránh lặp lại dữ liệu SML trong cấu trúc và chữ ký?

signature A = sig 
    datatype t = T of int | S of string 
end 

Có thể cung cấp một thực hiện (một cấu trúc) mà không có t lặp đi lặp lại? Ví dụ, trong chữ ký sau, định nghĩa của t được lặp lại. Đó là tốt cho các kiểu dữ liệu nhỏ, nhưng một chút vụng về cho những cái lớn hơn.

structure AImpl : A = struct 
    datatype t = T of int | S of string 
end 

Ý định của tôi chỉ đơn giản là đưa ra giao diện để người ta có thể biết tất cả các khai báo. Nhưng tôi không muốn mọi thực hiện lặp lại định nghĩa datatype.

Mặc dù có vẻ như chữ ký và cấu trúc có thể bao gồm một kiểu dữ liệu từ một cấu trúc khác, sau đó sẽ không thể biết khai báo kiểu dữ liệu bằng cách kiểm tra chữ ký một mình. Ví dụ:

structure AData = struct 
    datatype t = T of int | S of string 
end 

signature A = sig 
    datatype t = datatype AData.t 
end 

structure a : A = struct 
    open AData 
end 

Dĩ nhiên, phương pháp này, mặc dù không phải là thỏa mãn, có thể chấp nhận nếu tôi đặt cả hai ADataA trong cùng một tập tin .sig.

Trả lời

1

Không, không thể vì quy tắc khớp chữ ký hoạt động trong sml.

Khi bạn giới thiệu một số loại không trừu tượng trong chữ ký mọi cấu trúc với chữ ký này phải cung cấp cùng loại ràng buộc. Lý do là chữ ký trong sml được sử dụng chủ yếu để ẩn chi tiết cấu trúc.

Ví dụ, bạn có thể sử dụng loại trừu tượng để ẩn chi tiết datatype từ những người dùng cấu trúc:

signature A = 
sig 
    type t 
end 


structure AImpl :> A = 
struct 
    datatype t = T of int | S of string 
end 

Hoặc bạn có thể phơi bày chỉ là một loại constructor:

signature A = 
sig 
    type t 
    val T : int -> t 
end 


structure AImpl :> A = 
struct 
    datatype t = T of int | S of string 
end 

val test = AImpl.T 12; 
+0

Điều đó làm cho ý nghĩa. Chữ ký là để thực hiện ẩn. Chỉ nghĩ rằng tôi có thể đặt các chức năng phụ trợ vào cấu trúc khác (lồng nhau) và mở nó ra. – shhyou

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