src/Pure/ML-Systems/universal.ML
author wenzelm
Thu, 20 Dec 2007 21:12:00 +0100
changeset 25733 8722d68471ff
child 28255 6faea8ad8559
permissions -rw-r--r--
Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25733
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/ML-Systems/universal.ML
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
     4
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
     5
Universal values via tagged union.  Emulates structure Universal
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
     6
in Poly/ML 5.1.
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
     7
*)
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
     8
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
     9
signature UNIVERSAL =
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    10
sig
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    11
  type universal
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    12
  type 'a tag
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    13
  val tag: unit -> 'a tag
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    14
  val tagIs: 'a tag -> universal -> bool
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    15
  val tagInject: 'a tag -> 'a -> universal
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    16
  val tagProject: 'a tag -> universal -> 'a
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    17
end;
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    18
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    19
structure Universal: UNIVERSAL =
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    20
struct
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    21
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    22
type universal = exn;
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    23
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    24
datatype 'a tag = Tag of
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    25
 {is: universal -> bool,
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    26
  inject: 'a -> universal,
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    27
  project: universal -> 'a};
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    28
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    29
fun tag () =
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    30
  let exception Universal of 'a in
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    31
   Tag {
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    32
    is = fn Universal _ => true | _ => false,
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    33
    inject = Universal,
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    34
    project = fn Universal x => x}
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    35
  end;
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    36
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    37
fun tagIs (Tag {is, ...}) = is;
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    38
fun tagInject (Tag {inject, ...}) = inject;
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    39
fun tagProject (Tag {project, ...}) = project;
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    40
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    41
end;
8722d68471ff Universal values via tagged union. Emulates structure Universal in Poly/ML 5.1.
wenzelm
parents:
diff changeset
    42