Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Including two signatures, both with a 'type t' [Standard ML]

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 ts 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.)

like image 602
Andy Morris Avatar asked Oct 14 '22 04:10

Andy Morris


1 Answers

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.

like image 66
Norman Ramsey Avatar answered Oct 18 '22 20:10

Norman Ramsey