2010-06-06 5 views
4

надуманный пример:В том числе две подписи, как с «типа Т» [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 s приравнивать, в конечном итоге с:

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, который кажется мне менее идеальным.)

ответ

2

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

Для других вещей, которые являются неправильными с include и как их исправить, см. An Expressive Language of Signatures.

1

Вы ищете предложение о разделении.

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

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

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