Включая две подписи, обе с типом t [Standard ML]

Надуманный пример:

signature A =
sig
  type t
  val x: t
end

signature B =
sig
  type t
  val y: t
end

signature C = sig include A B end

Очевидно, это вызовет жалобы на то, что type t встречается дважды в C. Но есть ли способ выразить, что я хочу, чтобы два t были приравнены, заканчиваясь:

signature C =
sig
  type t
  val x: t
  val y: t
end

Я испробовал всевозможный глупый синтаксис, например include B where type t = A.t, который, что неудивительно, не сработал. Есть ли что-то, что я забыл попробовать?

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

(FWIW, фактическая причина, по которой я пытаюсь это сделать, — это монады в стиле Haskell и тому подобное, где MonadPlus — это просто смесь Monad и Alternative; в данный момент я просто повторяю содержимое ALTERNATIVE в MONAD_PLUS, что кажется мне далеким от идеала.)


person Andy Morris    schedule 06.06.2010    source источник


Ответы (2)


Вы из шланга. Лучшее, что вы можете сделать, это, как предлагает Джордан Льюис, использовать подструктуры и пункт о совместном использовании. Для include двух разных подписей, которые обе определяют t, всегда возникает ошибка. Так что смешивание ALTERNATIVE и MONAD_PLUS так, как вам хотелось бы, не сработает.

Предложение о других проблемах с include и о том, как их исправить, см. в разделе Выразительный язык подписей.

person Norman Ramsey    schedule 06.06.2010

Вы ищете пункт о совместном использовании.

signature C =
sig
  structure A1 : A
  structure B1 : B
  sharing type A1.t = B1.t
  type t = A1.t
  val z : t
end

Это гарантирует, что t A1 и t B1 одинаковы, и, кроме того, использует тот же самый t как тип значения z.

Стандартная грамматика ML '97 доступна здесь.

person Jordan Lewis    schedule 06.06.2010