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


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




[18]

val х = 2+1

val b = (x=7) end;

>structure S =

val x = 3 : int

val b = false : bool end

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

Поскольку, по мнению ML, приведенное выше объявление является приемлемым, указанная структура сопоставима с указанной сигнатурой. Почему это так? Данная структура сопоставима с сигнатурой SIG, поскольку:

1.S.x привязан к 3, что имеет тип int, как и требует сигнатура SIG.

2.S.b привязан к false, что имеет тип bool, как и требует сигнатура SIG.

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

Сигнатура может описывать меньше идентификаторов, чем их представлено в структуре. Например:

- structure S : SIG = struct

val x = 2+1

val b = (x=7)

val s = "Garbage" end;

>structure S =

val x = 3 : int

val b = false : bool end

Здесь в структуре S объявляются переменные х, b и s, в то время как сигнатура SIG описывает только переменные х и Ь. В результате не только тип переменной s является несущественным, но и вся переменная удаляется из структуры в процессе сопоставления с сигнатурой. Смысл этого состоит в том, что сигнатура SIG определяет проекцию (view) структуры, т.е. то, что должно быть видно в структуре; именно, она говорит, что должны быть видны только переменные х и Ь. Другие сигнатуры могут


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

-structure S =

val х = 2+1

val b = false

val s = "String" end;

>structure S =

val x = 3 : int

val b = false : bool

val s = "String": string end

-signature SIG =

val x : int

val b : bool end and SIG" = sig

val b : bool val s : string end;

-structure S: SIG = S and S" : SIG" = S; >

>structure S =

val x = 3 : int

val b = false : bool end

structure S = struct

val b = false : bool

val s = "String": string end

Упражнение 3.2.1 Сигнатура для структур, которые содержат предикат упорядочения для некоторого типа, может быть записана так:

signature ORD = sig type t

val le : t*t -> bool end


Создайте сопоставимые с этой сигнатурой структуры, которые содержат предикат упорядочения для типов int и real*string.

Если значение в структуре имеет полиморфный тип, то оно будет удовлетворять любой спецификации, которая задает частный случай этого полиморфного типа. Так, например, если х привязано в структуре к nil, то х будет иметь тип a list, и поэтому будет удовлетворять спецификациям, например, int list и bool list list. Но что будет, если спецификация содержит полиморфный тип? Пусть, например, в спецификации указано, что идентификатор f должен иметь тип a list -> a list. Чтобы соответствовать такой спецификации, в структуре идентификатор f должен быть привязан к функции, получающей в качестве аргумента список любого типа и возвращающей в качестве результата список того же типа. Недостаточно, чтобы f имела тип, скажем, int list -> int list, поскольку спецификация требует, чтобы f была применима к bool list и т.д. Общий принцип состоит в том, что структура должна быть по крайней мере столь же общей, сколь общей является сигнатура. Таким образом, если в некоторой структуре имя f привязано к тождественной функции, которая имеет тип а-> а, то f удовлетворяет спецификации, требующей функции типаa list -> a list. Причина состоит в том, что f может получить аргумент любого и типа и выработать результат того же типа, и тем более f может получить список некоторого типа и выработать в результате список того же типа. Вот несколько примеров:

-signature SIG =

val n : a list val 1: int list val f: a list -> a list end;

-structure S : SIG =

val n = nil(*

val 1 = nil(*

fun f(x) = x(* end

a list *) a list *) a->a *)

Упражнение 3.2.2 Что неправильного в следующем объявлении?

structure S : SIG = struct

val n = [3,4]

val 1 = nil

fun f(x) = x end



[стр.Начало] [стр.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]