Включая две подписи, обе с типом t [Standard ML] - PullRequest
5 голосов
/ 06 июня 2010

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

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, настоящая причина, по которой я пытаюсь это сделать, это монады в стиле Хаскеля и т. Д., Где MonadPlus - это просто сочетание Monad и Alternative; на данный момент я просто повторяю содержимое ALTERNATIVE в MONAD_PLUS, что кажется мне менее чем идеальным.)

Ответы [ 2 ]

2 голосов
/ 06 июня 2010

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

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

2 голосов
/ 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 и B1 совпадают, и, кроме того, использует тот же t, что и тип значения z.

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

...