Dear all,

some year ago, I've complained about the lack of good old abstract datatypes in Scala. Some of the reactions were that I was asking for wrong things in an "object-oriented" environment, pointing to classic literature about that.

In the meantime, I've managed to do it in a reasonably simple way, e.g. see http://isabelle.in.tum.de/repos/isabelle/file/83294cd0e7ee/src/Pure/General/graph.scala

  object Graph
  {
    // public operations to create ADT instances
  }

  final class Graph[Key, A] private(rep: SortedMap[Key, (A, (SortedSet[Key], 
SortedSet[Key]))])
  {
    // implementation with access to rep
  }

The main thing is the "private" in this odd position, which is Odersky's way to make the constructor private, but the keep the type itself public. This detail seems to have been forgotten in Java -- in fact in a recent talk some Java guru admitted that -- which was also my starting point to google for "private constructor" to find the above solution.

Moreover, the "final" prevents unexpected behaviour from class extensions. It is a concession to the remaining ooddities of the platform.

Now after 25 years we are almost as concise as ancient abstype in ML :-)


Next inappropriate question for Scala: How to avoid the ubiquitious NPE problem of the JVM?


        Makarius
_______________________________________________
isabelle-dev mailing list
[email protected]
https://mailmanbroy.informatik.tu-muenchen.de/mailman/listinfo/isabelle-dev

Reply via email to