A contrived example:
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
Obviously, this will cause complaints that type t
occurs twice in C
. But is there any way to express that I want the two t
s to be equated, ending up with:
signature C =
sig
type t
val x: t
val y: t
end
I tried all sorts of silly syntax like include B where type t = A.t
, which unsurprisingly didn't work. Is there something I've forgotten to try?
Also, I know that this would be simply answered by checking the language's syntax for anything obvious (or a lack of), but I couldn't find a complete grammar anywhere on the internet.
(FWIW, the actual reason I'm trying to do this is Haskell-style monads and such, where a MonadPlus
is just a mix of a Monad
and an Alternative
; at the moment I'm just repeating the contents of ALTERNATIVE
in MONAD_PLUS
, which strikes me as less than ideal.)
You're hosed. The best you can do is, as Jordan Lewis suggests, use substructures and a sharing clause. To include
two different signatures that both define t
is always an error. So mixing ALTERNATIVE
and MONAD_PLUS
in the way you would like just isn't going to work.
For a proposal of other things that are wrong with include
and how to fix them, see An Expressive Language of Signatures.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With