2010-06-06 3 views
4

Un exemple artificiel:Y compris deux signatures, à la fois avec un 'type 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 

De toute évidence, cela entraînera des plaintes que type t se produit deux fois dans C. Mais est-il un moyen d'exprimer que je veux que les deux t s à assimiler, de se retrouver avec:

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

J'ai essayé toutes sortes de syntaxe stupide comme include B where type t = A.t, qui sans surprise ne fonctionne pas. Y a-t-il quelque chose que j'ai oublié d'essayer?

Aussi, je sais que cela serait simplement répondu en vérifiant la syntaxe de la langue pour quelque chose d'évident (ou un manque de), mais je ne pouvais pas trouver une grammaire complète nulle part sur internet.

(FWIW, la raison réelle que je suis en train de faire est monades de style Haskell et tel, lorsqu'une MonadPlus est juste un mélange d'un Monad et un Alternative, au moment où je ne fais que répéter le contenu de ALTERNATIVE dans MONAD_PLUS, ce qui me semble moins qu'idéale.)

Répondre

2

Vous êtes arrosé. Le mieux que vous pouvez faire est, comme le suggère Jordan Lewis, d'utiliser des sous-structures et une clause de partage. Pour include deux signatures différentes qui définissent à la fois t est toujours une erreur. Donc, mélanger ALTERNATIVE et MONAD_PLUS de la façon dont vous voulez juste ne va pas travailler.

Pour une proposition d'autres choses qui ne vont pas avec include et comment les corriger, voir An Expressive Language of Signatures.

1

Vous êtes à la recherche d'une clause de partage.

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

Ceci assure que 't A1 et B1' t sont les mêmes, et utilise en outre que même t que le type d'une valeur z.

La grammaire standard ML '97 est disponible here.