Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[21]

val у = Т.х+1 end;

>structure S =

val у = 8 : int end

Ясно, что S может быть использована независимо от Т, хотя S и определена с помощью ссылки на Т. Эта форма зависимости иногда называется зависимостью по построению.

Существенная зависимость является гораздо более важной. Одна из форм существенной зависимости возникает тогда, когда Т объявляет исключения, которые могут возбуждаться функциями, принадлежащими S. Например:

-structure Т =

exception Barf

fun foo(x) = if x=0 then raise Barf else 3 div x end;

>structure T =

exception Barf

val foo(x) = fn :int -> int end

-structure S =

fun g(x) = T.foo(x)+l end

Поскольку вычисление S.g(O) возбуждает исключение Barf, использование S возможно только в том контексте, в котором доступна Т - иначе исключение не сможет быть обработано. Поэтому S существенно зависит от Т, и должна использоваться только вместе с Т. Заметьте, однако, что зависимость является неявной, поскольку сигнатура S не содержит ссылок на Т.

Существенная и явная зависимость возникает тогда, когда S открыто использует рекурсивный тип, определенный в Т, как например:

-structure Т =

datatype a List = Nil I Cons of a * a List fun len(Nil) = 0

I len(Cons(h,t)) = 1 + len(t)


>structure Т =

type a List

con Nil : a List

con Cons : a * a List -> a List val len = fn : a List -> int end;

-structure S =

val len = T.len end;

>structure S =

val len = fn : a T.List -> int end

Заметьте, что сигнатура структуры S содержит ссылку на структуру Т, отражая тот факт, что len может быть применена только к значениям типа, определенного в Т. Заметьте, что правило замкнутости сигнатуры не позволяет в приведенном выше примере приписать структуре S какую-либо нетривиальную сигнатуру, поскольку сигнатура не может содержать свободный идентификатор структуры Т. Это на первый взгляд может показаться неоправданным ограничением; однако этом позволяет привлечь внимание к тому факту, что S и Т тесно связаны между собой, и поэтому должны быть объединены в один модуль. Такое объединение может быть выполнено путем включения структуры Т в структуру S в качестве подструктуры; последнее достигается с помощью включения объявления Т в набор инкапсулированных объявлений S, как это показано в следующем примере:

-structure S =

structure Т = struct

datatype a List = Nil I Cons of a * a List fun len(Nil) = 0 I len (Cons(h.t)) = 1 + len(t) end

val len = T.len end

>structure S =

structure T = struct

type a List

con Nil : a List


con Cons : а * a List -> a List val len = fn : a List -> int end

val len = fn : a T.List -> int end

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

Появление подструктур требует обобщения введенного ранее понятия пути доступа к структуре. В общем случае путь доступа к структуре записывается как разделенная точками последовательность имен структур, в которой каждая последующая структура является подструктурой предыдущей. Например, S.T является путем доступа к структуре, a S.T.len является составным именем, которое выбирает функцию len подструктуры Т структуры S.

Если Т является подструктурой структуры S, то сигнатура S будет выглядеть следующим образом:

-signature SIGT =

datatype a List = Nil I Cons of a * a List val len : a List -> int end;

-signature SIGS =

structure T: SIGT val len : a T.List -> int end;

Обратите внимание на спецификацию в SIGS, которая указывает, что подструктура Т должна быть сопоставима с сигнатурой SIGT. Заметьте также то, что спецификация для len в SIGS содержит T.List; T.List является локальным в SIGS благодаря тому, что Т есть подструктура S.

Упражнение 3.2.6 Определите структуру Ехр, которая реализует некоторый рекурсивный тип выражений и набор связанных с ними операций. Эта структура должна быть сопоставимой с сигнатурой

signature ЕХР = sig

datatype id = Id of string datatype exp = Var of id

I App of id * (exp list)



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32]