2014-11-07 2 views
5

Учитывая подпись A с типом данных t, скажемКак избежать повторения данных типа SML в структурах и подписях?

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

Можно ли обеспечить реализацию (структуру), которая не имеет повторен t? Например, в следующей подписи повторяется определение t. Это нормально для небольших типов данных, но немного неуклюжими для более крупных.

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

Мое намерение - просто дать интерфейс, чтобы можно было узнать все объявления. Но я не хочу, чтобы каждая реализация повторяла определение типа данных.

Хотя кажется, что подпись и структура могут включать в себя тип данных из другой структуры, тогда было бы невозможно узнать объявление типа данных, проверив только подпись. Например:

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 

Конечно, такой подход, хотя и не то, что удовлетворение, является приемлемым, если я ставлю как AData и A в том же .sig файле.

ответ

1

Нет, это невозможно из-за того, как правила соответствия подписей работают в sml.

Когда вы вводите какой-либо не абстрактный тип в сигнатуре каждой структуры с , эта подпись должна обеспечивать однотипную привязку. Причина в том, что подписи в sml используются главным образом для скрытия деталей структуры.

Например, вы можете использовать абстрактный тип, чтобы скрыть детали типов данных от пользователей структуры:

signature A = 
sig 
    type t 
end 


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

Или вы можете выставить только один конструктор типа:

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

Это имеет смысл. Подпись предназначена для скрытия реализации. Просто подумал, что я мог бы поставить вспомогательные функции в другую (вложенную) структуру и открыть ее. – shhyou

Смежные вопросы