0% found this document useful (0 votes)
54 views4 pages

Tagged Values I (Chapter 7) : Motivation For Disjoint Union Types

prolog

Uploaded by

Alvaro Souza
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
54 views4 pages

Tagged Values I (Chapter 7) : Motivation For Disjoint Union Types

prolog

Uploaded by

Alvaro Souza
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 4

Motivation for disjoint union types

Task: dene a representation for a collection of shapes.

Introduction to SML
Tagged Values I (Chapter 7)
Michael R. Hansen and Anne E. Haxthausen
[email protected] and [email protected]

Informatics and Mathematical Modelling

Representation of different shapes:


type Circle = {radius: real}
type Square = {side: real}
type Triangle = {side1:real,side2:real,side3:real}
How can we represent a collection of different shapes?

Technical University of Denmark

In a list all elements must have the same type, so we must make a
common type Shape to use lists:
type shapeCollection = Shape list

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.1/14

How can we dene the common Shape type?


c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.3/14

Motivation for disjoint union types

Main topics:

A bad solution for a common shape type:


type Shape =
{ kind : string,
radius: real,
side : real,
side1 : real, side2 : real, side3 : real}

datatype declarations and their use


non recursive (chap. 7)
recursive (chap. 8)

Overview of chapters 7 and 8

abstype declarations and their use (chap. 8)

Additional topics (chap. 7):


A good solution: dene Shape as a disjoint union of the Circle,
Square and Triangle representations.

case expressions

patterns
Union types can be dened by SML datatype declarations.

exceptions
partial functions

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.2/14

This slide set covers topics from chapter 7.


c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.4/14

Constructors in Patterns

A shape is either a circle, a square, or a triangle

fun area(Circle r)
= Math.pi * r * r
| area(Square a)
= a * a
| area(Triangle(a,b,c)) =
let val d = (a + b + c)/2.0
in Math.sqrt(d*(d-a)*(d-b)*(d-c))
end;
> val area = fn : shape -> real

a constructor only matches itself

area (Circle 1.2)


Math.pi * r * r r

1.2

Answer from the SML system:


> datatype shape
>
con Circle = fn : real -> shape
>
con Square = fn : real -> shape
>
con Triangle = fn : real * real * real -> shape

A datatype declaration for shapes:


datatype shape = Circle of real
| Square of real
| Triangle of real*real*real;

the union of three disjoint sets

Disjoint Union: An Example

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.5/14

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.7/14

Constructors of a datatype

The case-expression

The tags Circle, Square and Triangle are constructors of


values of type shape
- Circle 2.0;
> val it = Circle 2.0 : shape

Form:

- Triangle(1.0, 2.0, 3.0) = Square 2.0;


> val it = false : bool
c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.6/14

=> e

| pat

Example:
fun area s =
case s of
(Circle r)
=> Math.pi * r * r
| (Square a)
=> a*a
| (Triangle(a,b,c)) =>
let val d = (a + b + c)/2.0
in Math.sqrt(d*(d-a)*(d-b)*(d-c))
end;

Equality on shapes is dened provided

- Square 4.0;
> val it = Square 4.0 : shape

| pat

- Triangle(1.0, 2.0, 3.0);


> val it = Triangle(1.0, 2.0, 3.0) : shape

=> e
=> e

pat

case exp of

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.8/14

is partial, if application

when declaring in SML:





fun fact 0 = 1 | fact n = n * fact(n-1);

let

raise an user-dened exception

return a special value (NONE) and


return SOME when
is dened to give

let
let

 


fun fact1 n = if n < 0 then raise BadArgument n


else fact n;

fun fact2 n = if n < 0 then NONE


else SOME (fact n);

Example:
fun countLEG []
= (0,0,0)
| countLEG(x::rest) =
let val (y1,y2,y3) = countLEG rest in
case Int.compare(x,0) of
LESS
=> (y1+1,y2 ,y3 )
| EQUAL
=> (y1 ,y2+1,y3 )
| GREATER => (y1 ,y2 ,y3+1)
end;

be undened (e.g. no match, no termination, ...)

let

Int.compare(

Three possibilities for treating


LESS
if
EQUAL
if
GREATER if

is undened for



 



datatype order = LESS | EQUAL | GREATER;


Predened compare functions, e.g.

A function
some value

Partial functions



Enumeration types the predened order type

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.9/14

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.11/14

Polymorphic types, the predened option type

Partial functions, example

Example: datatype a option = NONE | SOME of a

- fact1 3;
> val it = 6 : int

The type a option is parameterized with the element type.


The value constructors are polymorphic:
con a NONE = NONE : a option
con a SOME = fn : a -> a option

- fact2 3;
> val it = SOME 6 : int option

SOME 3 has type int option which is an instance of a option.

- fact1 1;
! Uncaught exception:
! BadArgument

Polymorphic types contain type variables: a list, a option,


...

- fact2 1;
> val it = NONE : int option

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.10/14

Monomorphic types do not contain type variables:


int, int list, bool list, int option, ...

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.12/14

Exceptions
Exceptions are used to terminate the evaluation of an expression
with an error signal.
Issues:




exception handling (catching) :


handle
=>
...
=>
where
is an exception raising pattern of one of the forms:
or
, and
has same type as

exception raising:
raise
or raise

declaration of exception constructors


:
exception
or exception
of

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.13/14

Exceptions: examples
Declaring an exception: exception BadArgument of int;
Specifying an exception to be raised:
fun fact1 n = if n < 0 then raise BadArgument n else fact n;

No handling of exception:
- fact1 2;
> ! Uncaught exception:
> ! BadArgument

Handling an exception:
- fun usefact1 n =
... fact1 n ...
handle BadArgument n => "Bad argument "Int.toString n;

- usefact1 2;
> val it = "Bad argument 2" : string

c Michael R. Hansen and Anne E. Haxthausen, Fall 2006 p.14/14

You might also like