Изобретенный пример:
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
s, чтобы быть приравненным, заканчиваясь с:
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
, который кажется мне меньше, чем идеал.)
Ты в шланге. Лучшее, что вы можете сделать, это, как предлагает Джордан Льюис, использовать подструктуры и предложение совместного использования. В включить
две разные сигнатуры, каждая из которых определяет t
всегда является ошибкой. Так что смешивание ALTERNATIVE
и MONAD_PLUS
так, как вы хотели бы, просто не сработает.
Чтобы узнать о других недостатках , включая
, и о том, как их исправить, см. An Expressive Language of Signatures .
Вам нужен пункт о совместном использовании.
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 доступна здесь .