doc-src/TutorialI/Misc/Option2.thy
author nipkow
Thu, 11 Jan 2001 12:49:48 +0100
changeset 10868 5af3906edec8
parent 10561 d960cc4a6afc
child 11310 51e70b7bc315
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10561
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
     2
theory Option2 = Main:
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
     3
hide const None Some
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
     4
hide type option
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
     5
(*>*)
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
     6
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
     7
text{*\indexbold{*option}\indexbold{*None}\indexbold{*Some}
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
     8
Our final datatype is very simple but still eminently useful:
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
     9
*}
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    10
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    11
datatype 'a option = None | Some 'a;
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    12
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    13
text{*\noindent
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    14
Frequently one needs to add a distiguished element to some existing type.
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    15
For example, type @{text"t option"} can model the result of a computation that
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    16
may either terminate with an error (represented by @{term None}) or return
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    17
some value @{term v} (represented by @{term"Some v"}).
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    18
Similarly, @{typ nat} extended with $\infty$ can be modeled by type
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    19
@{typ"nat option"}. In both cases one could define a new datatype with
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    20
customized constructors like @{term Error} and @{term Infinity},
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    21
but it is often simpler to use @{text option}. For an application see
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    22
\S\ref{sec:Trie}.
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    23
*}
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    24
(*<*)
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    25
(*
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    26
constdefs
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    27
 infplus :: "nat option \<Rightarrow> nat option \<Rightarrow> nat option"
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    28
"infplus x y \<equiv> case x of None \<Rightarrow> None
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    29
               | Some m \<Rightarrow> (case y of None \<Rightarrow> None | Some n \<Rightarrow> Some(m+n))"
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    30
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    31
*)
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    32
end
d960cc4a6afc *** empty log message ***
nipkow
parents:
diff changeset
    33
(*>*)