Включая две подписи, обоих с 'типом t' [Стандарт 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. Но есть ли любой способ выразить, что я хочу два ts, чтобы быть приравненным, заканчиваясь с:

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

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

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

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

5
задан Andy Morris 6 June 2010 в 00:17
поделиться

2 ответа

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

Чтобы узнать о других недостатках , включая , и о том, как их исправить, см. An Expressive Language of Signatures .

2
ответ дан 15 December 2019 в 00:51
поделиться

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

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 доступна здесь .

2
ответ дан 15 December 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: