ML Type Definitions and Constructors

A Fourth Look At ML
Chapter Eleven
Modern Programming Languages, 2nd ed.
1
Type Definitions
n
Predefined, but not primitive in ML:
n
Type constructor for lists:
n
Defined for ML 
in ML
Chapter Eleven
Modern Programming Languages, 2nd ed.
2
datatype bool = true | false;
datatype 'element list = nil |
   :: of 'element * 'element list
Outline
n
Enumerations
n
Data constructors with parameters
n
Type constructors with parameters
n
Recursively defined type constructors
n
Farewell to ML
Chapter Eleven
Modern Programming Languages, 2nd ed.
3
Defining Your Own Types
n
New types can be defined using the
keyword 
datatype
n
These declarations define both:
type constructors
 for making new (possibly
polymorphic) types
data constructors
 for making values of those
new types
Chapter Eleven
Modern Programming Languages, 2nd ed.
4
Example
n
day 
is the new type constructor and 
Mon
,
Tue
, etc. are the new data constructors
n
Why “constructors”?  In a moment we will
see how both can have parameters…
Chapter Eleven
Modern Programming Languages, 2nd ed.
5
- 
datatype 
day = Mon | Tue | Wed | Thu | Fri | Sat | Sun;
datatype day = Fri | Mon | Sat | Sun | Thu | Tue | Wed
- 
fun isWeekDay x = not (x = Sat orelse x = Sun);
val isWeekDay = fn : day -> bool
- 
isWeekDay Mon;
val it = true : bool
- 
isWeekDay Sat;
val it = false : bool
No Parameters
n
The type constructor 
day
 takes no
parameters: it is not polymorphic, there is
only one 
day
 type
n
The data constructors 
Mon
, 
Tue
, etc. take
no parameters: they are constant values of
the 
day
 type
n
Capitalize the names of data constructors
Chapter Eleven
Modern Programming Languages, 2nd ed.
6
- 
datatype 
day = Mon | Tue | Wed | Thu | Fri | Sat | Sun;
datatype day = Fri | Mon | Sat | Sun | Thu | Tue | Wed
Strict Typing
n
ML is strict about these new types, just as
you would expect
n
Unlike C 
enum
, no implementation details
are exposed to the programmer
Chapter Eleven
Modern Programming Languages, 2nd ed.
7
- 
datatype flip = Heads | Tails;
datatype flip = Heads | Tails
- 
fun isHeads x = (x = Heads);
val isHeads = fn : flip -> bool
- 
isHeads Tails;
val it = false : bool
- 
isHeads Mon;
Error: operator and operand don't agree [tycon mismatch]
  operator domain: flip
  operand:         day
Data Constructors In Patterns
n
You can use the data constructors in
patterns
n
In this simple case, they are like constants
n
But we will see more general cases next
Chapter Eleven
Modern Programming Languages, 2nd ed.
8
fun isWeekDay Sat = false
|   isWeekDay Sun = false
|   isWeekDay _ = true;
Outline
n
Enumerations
n
Data constructors with parameters
n
Type constructors with parameters
n
Recursively defined type constructors
n
Farewell to ML
Chapter Eleven
Modern Programming Languages, 2nd ed.
9
Wrappers
n
You can add a parameter of any type to a data
constructor, using the keyword 
of
:
datatype exint = Value of int | PlusInf | MinusInf;
n
In effect, such a constructor is a wrapper that
contains a data item of the given type
Chapter Eleven
Modern Programming Languages, 2nd ed.
10
PlusInf
Value
36
MinusInf
Value
26
Value
38
Some things
of type 
exint
:
n
Value
 is a data constructor that takes a
parameter: the value of the 
int
 to store
n
It looks like a function that takes an 
int
and returns an 
exint
 containing that 
int
Chapter Eleven
Modern Programming Languages, 2nd ed.
11
- 
datatype exint = Value of int | PlusInf | MinusInf;
datatype exint = MinusInf | PlusInf | Value of int
- 
PlusInf;
val it = PlusInf : exint
- 
MinusInf;
val it = MinusInf : exint
- 
Value;
val it = fn : int -> exint
- 
Value 3;
val it = Value 3 : exint
A 
Value
 Is Not An 
int
n
Value 5
 is an 
exint
n
It is not an 
int
, though it contains one
n
How can we get the 
int
 out again?
n
By pattern matching…
Chapter Eleven
Modern Programming Languages, 2nd ed.
12
- 
val x = Value 5;
val x = Value 5 : exint
- 
x+x;
Error: overloaded variable not defined at type
  symbol: +
  type: exint
Patterns With Data Constructors
n
To recover a data constructor’s parameters,
use pattern matching
n
So 
Value
 is no ordinary function: ordinary
functions can't be pattern-matched this way
n
Note that this example only works because
x
 actually is a 
Value
 here
Chapter Eleven
Modern Programming Languages, 2nd ed.
13
- 
val (Value y) = x;
val y = 5 : int
An Exhaustive Pattern
n
An 
exint
 can be a 
PlusInf
, a
MinusInf
, or a 
Value
n
Unlike the previous example, this one says
what to do for all possible values of 
x
Chapter Eleven
Modern Programming Languages, 2nd ed.
14
- 
val s = case x of
=           
PlusInf => "infinity" |
=           
MinusInf => "-infinity" | 
=           
Value y => Int.toString y;
val s = "5" : string
Pattern-Matching Function
n
Pattern-matching function definitions are
especially important when working with
your own datatypes
Chapter Eleven
Modern Programming Languages, 2nd ed.
15
- 
fun square PlusInf = PlusInf
= 
|   square MinusInf = PlusInf
= 
|   square (Value x) = Value (x*x);
val square = fn : exint -> exint
- 
square MinusInf;
val it = PlusInf : exint
- 
square (Value 3);
val it = Value 9 : exint
Exception Handling (A Peek)
n
Patterns are also used in ML for exception
handling, as in this example
n
We’ll see it in Java, but skip it in ML
Chapter Eleven
Modern Programming Languages, 2nd ed.
16
- 
fun square PlusInf = PlusInf
= 
|   square MinusInf = PlusInf
= 
|   square (Value x) = Value (x*x)
=       
handle Overflow => PlusInf;
val square = fn : exint -> exint
- 
square (Value 10000);
val it = Value 100000000 : exint
- 
square (Value 100000);
val it = PlusInf : exint
Outline
n
Enumerations
n
Data constructors with parameters
n
Type constructors with parameters
n
Recursively defined type constructors
n
Farewell to ML
Chapter Eleven
Modern Programming Languages, 2nd ed.
17
Type Constructors With
Parameters
n
Type constructors can also use parameters: 
datatype 'a option = NONE | SOME of 'a;
 
n
The parameters of a type constructor are type
variables, which are used in the data constructors
n
The result: a new polymorphic type
Chapter Eleven
Modern Programming Languages, 2nd ed.
18
NONE
SOME
"Hello"
Values of type
string option
SOME
"world"
NONE
SOME
1.5
Values of type
 
real option
SOME
123.4
Parameter Before Name
n
Type constuctor parameter comes before the
type constructor name:
datatype 'a option = NONE | SOME of 'a;
 
n
We have types 
'
a option
 and
int option
, just like 
'
a list
 and
int list
Chapter Eleven
Modern Programming Languages, 2nd ed.
19
- SOME 4;
val it = SOME 4 : int option
- SOME 1.2;
val it = SOME 1.2 : real option 
- SOME "pig";
val it = SOME "pig" : string option
Uses For 
option
n
Predefined type constructor in ML
n
Used by predefined functions (or your own)
when the result is not always defined
Chapter Eleven
Modern Programming Languages, 2nd ed.
20
- 
fun optdiv a b =
=   
if b = 0 then NONE else SOME (a div b);
val optdiv = fn : int -> int -> int option
- 
optdiv 7 2;
val it = SOME 3 : int option
- 
optdiv 7 0;
val it = NONE : int option
Longer Example: 
bunch
n
An 
'x bunch
 is either a thing of type 
'x
, or a
list of things of type 
'x
n
As usual, ML infers types:
Chapter Eleven
Modern Programming Languages, 2nd ed.
21
 
datatype 'x bunch =
   One of 'x |
   Group of 'x list;
- 
One 1.0;
val it = One 1.0 : real bunch
- 
Group [true,false];
val it = Group [true,false] : bool bunch
Example: Polymorphism
n
ML can infer 
bunch
 types, but does not
always have to resolve them, just as with
list 
types
Chapter Eleven
Modern Programming Languages, 2nd ed.
22
- 
fun size (One _) = 1
= 
|   size (Group x) = length x;
val size = fn : 'a bunch -> int
- 
size (One 1.0);
val it = 1 : int
- 
size (Group [true,false]);
val it = 2 : int
Example: No Polymorphism
n
We applied the 
+
 operator (through 
foldr
)
to the list elements
n
So ML knows the parameter type must be
int bunch
Chapter Eleven
Modern Programming Languages, 2nd ed.
23
- 
fun sum (One x) = x
= 
|   sum (Group xlist) = foldr op + 0 xlist;
val sum = fn : int bunch -> int
- 
sum (One 5);
val it = 5 : int
- 
sum (Group [1,2,3]);
val it = 6 : int
Outline
n
Enumerations
n
Data constructors with parameters
n
Type constructors with parameters
n
Recursively defined type constructors
n
Farewell to ML
Chapter Eleven
Modern Programming Languages, 2nd ed.
24
Recursively Defined Type
Constructors
n
The type constructor being defined may be
used in its own data constructors:
 
datatype intlist =
   INTNIL |
   INTCONS of int * intlist;
Chapter Eleven
Modern Programming Languages, 2nd ed.
25
Some values of
type 
intlist
:
 
Constructing Those Values
Chapter Eleven
Modern Programming Languages, 2nd ed.
26
- 
INTNIL;
val it = INTNIL : intlist
- 
INTCONS (1,INTNIL);
val it = INTCONS (1,INTNIL) : intlist
- 
INTCONS (1,INTCONS(2,INTNIL));
val it = INTCONS (1,INTCONS (2,INTNIL)) : intlist
An 
intlist
 Length Function
n
A length function
n
Much like you would write for native lists
n
Except, of course, that native lists are not
always lists of integers…
Chapter Eleven
Modern Programming Languages, 2nd ed.
27
fun intlistLength INTNIL = 0
  | intlistLength (INTCONS(_,tail)) = 
       1 + (intListLength tail);
fun listLength nil = 0
  | listLength (_::tail) = 
       1 + (listLength tail);
Parametric List Type
n
A parametric list type, almost like the
predefined 
list
n
ML handles type inference in the usual way:
Chapter Eleven
Modern Programming Languages, 2nd ed.
28
datatype 'element mylist =
  NIL |
  CONS of 'element * 'element mylist;
- 
CONS(1.0, NIL);
val it = CONS (1.0,NIL) : real mylist
- 
CONS(1, CONS(2, NIL));
val it = CONS (1,CONS (2,NIL)) : int mylist
Some 
mylist
 Functions
n
This now works almost exactly like the
predefined 
list
 type constructor
n
Of course, to add up a list you would use
foldr
Chapter Eleven
Modern Programming Languages, 2nd ed.
29
fun myListLength NIL = 0
  | myListLength (CONS(_,tail)) = 
       1 + myListLength(tail);
fun addup NIL = 0
  | addup (CONS(head,tail)) =
       head + addup tail;
A 
foldr
 For 
mylist
n
Definition of a function like 
foldr 
that
works on 
'a mylist
n
Can now add up an 
int mylist x
 with:
    myfoldr (op +) 0 x
n
One remaining difference: 
::
 is an operator
and 
CONS
 is not
Chapter Eleven
Modern Programming Languages, 2nd ed.
30
fun myfoldr f c NIL = c
  | myfoldr f c (CONS(a,b)) = 
       f(a, myfoldr f c b);
Defining Operators (A Peek)
n
ML allows new operators to be defined
n
Like this:
Chapter Eleven
Modern Programming Languages, 2nd ed.
31
- 
infixr 5 CONS;
infixr 5 CONS
- 
1 CONS 2 CONS NIL;
val it = 1 CONS 2 CONS NIL : int mylist
Polymorphic Binary Tree
datatype 'data tree =
   Empty |
   Node of 'data tree * 'data * 'data tree;
Chapter Eleven
Modern Programming Languages, 2nd ed.
32
Some values of
type 
int tree
:
 
Constructing Those Values
Chapter Eleven
Modern Programming Languages, 2nd ed.
33
- 
val treeEmpty = Empty;
val treeEmpty = Empty : 'a tree
- 
val tree2 = Node(Empty,2,Empty);
val tree2 = Node (Empty,2,Empty) : int tree
- 
val tree123 = Node(Node(Empty,1,Empty),
=                    
2,
=                    
Node(Empty,3,Empty));
Increment All Elements
Chapter Eleven
Modern Programming Languages, 2nd ed.
34
fun incall Empty = Empty
  | incall (Node(x,y,z)) =
       Node(incall x, y+1, incall z);
- 
incall tree123;
val it = Node (Node (Empty,2,Empty),
               3,
               Node (Empty,4,Empty)) : int tree
Add Up The Elements
Chapter Eleven
Modern Programming Languages, 2nd ed.
35
fun sumall Empty = 0
  | sumall (Node(x,y,z)) =
       sumall x + y + sumall z;
- 
sumall tree123;
val it = 6 : int
Convert To List (Polymorphic)
Chapter Eleven
Modern Programming Languages, 2nd ed.
36
fun listall Empty = nil
  | listall (Node(x,y,z)) =
       listall x @ y :: listall z;
- 
listall tree123;
val it = [1,2,3] : int list
Tree Search
Chapter Eleven
Modern Programming Languages, 2nd ed.
37
fun isintree x Empty = false
  | isintree x (Node(left,y,right)) =
       x=y
       orelse isintree x left
       orelse isintree x right;
- 
isintree 4 tree123;
val it = false : bool
- 
isintree 3 tree123;
val it = true : bool
Outline
n
Enumerations
n
Data constructors with parameters
n
Type constructors with parameters
n
Recursively defined type constructors
n
Farewell to ML
Chapter Eleven
Modern Programming Languages, 2nd ed.
38
That's All
n
That’s all the ML we will see
n
There is, of course, a lot more
n
A few words about the parts we skipped:
records (like tuples with named fields)
arrays, with elements that can be altered
references, for values that can be altered
exception handling
Chapter Eleven
Modern Programming Languages, 2nd ed.
39
More Parts We Skipped
support for encapsulation and data hiding:
n
structures: collections of datatypes, functions, etc.
n
signatures: interfaces for structures
n
functors: like functions that operate on structures,
allowing type variables and other things to be
instantiated across a whole structure
Chapter Eleven
Modern Programming Languages, 2nd ed.
40
More Parts We Skipped
API: the standard basis
n
predefined functions, types, etc.
n
Some at the top level but most in structures:
Int.maxInt
, 
Real.Math.sqrt
, 
List.nth
,
etc.
Chapter Eleven
Modern Programming Languages, 2nd ed.
41
More Parts We Skipped
eXene: an ML library for applications that work
in the X window system
the Compilation Manager for building large
ML projects
n
Other dialects besides Standard ML
Ocaml
F# (in Visual Studio, for the .NET platform)
Concurrent ML (CML) extensions
Chapter Eleven
Modern Programming Languages, 2nd ed.
42
Functional Languages
n
ML supports a function-oriented style of
programming
n
If you like that style, there are many other
languages to explore, like Lisp and Haskell
Chapter Eleven
Modern Programming Languages, 2nd ed.
43
Slide Note
Embed
Share

Explore the concepts of type definitions and constructors in ML, including predefined and user-defined types, data constructors, and type constructors. Learn how to create new types, define constructors, and work with parameterized constructors in Modern Programming Languages.

  • ML
  • Type Definitions
  • Constructors
  • Data Constructors
  • Type Constructors

Uploaded on Sep 29, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. A Fourth Look At ML Chapter Eleven Modern Programming Languages, 2nd ed. 1

  2. Type Definitions Predefined, but not primitive in ML: datatype bool = true | false; Type constructor for lists: datatype 'element list = nil | :: of 'element * 'element list Defined for ML in ML Chapter Eleven Modern Programming Languages, 2nd ed. 2

  3. Outline Enumerations Data constructors with parameters Type constructors with parameters Recursively defined type constructors Farewell to ML Chapter Eleven Modern Programming Languages, 2nd ed. 3

  4. Defining Your Own Types New types can be defined using the keyword datatype These declarations define both: type constructors for making new (possibly polymorphic) types data constructors for making values of those new types Chapter Eleven Modern Programming Languages, 2nd ed. 4

  5. Example - datatype day = Mon | Tue | Wed | Thu | Fri | Sat | Sun; datatype day = Fri | Mon | Sat | Sun | Thu | Tue | Wed - fun isWeekDay x = not (x = Sat orelse x = Sun); val isWeekDay = fn : day -> bool - isWeekDay Mon; val it = true : bool - isWeekDay Sat; val it = false : bool day is the new type constructor and Mon, Tue, etc. are the new data constructors Why constructors ? In a moment we will see how both can have parameters Chapter Eleven Modern Programming Languages, 2nd ed. 5

  6. No Parameters - datatype day = Mon | Tue | Wed | Thu | Fri | Sat | Sun; datatype day = Fri | Mon | Sat | Sun | Thu | Tue | Wed The type constructor day takes no parameters: it is not polymorphic, there is only one day type The data constructors Mon, Tue, etc. take no parameters: they are constant values of the day type Capitalize the names of data constructors Chapter Eleven Modern Programming Languages, 2nd ed. 6

  7. Strict Typing - datatype flip = Heads | Tails; datatype flip = Heads | Tails - fun isHeads x = (x = Heads); val isHeads = fn : flip -> bool - isHeads Tails; val it = false : bool - isHeads Mon; Error: operator and operand don't agree [tycon mismatch] operator domain: flip operand: day ML is strict about these new types, just as you would expect Unlike C enum, no implementation details are exposed to the programmer Chapter Eleven Modern Programming Languages, 2nd ed. 7

  8. Data Constructors In Patterns fun isWeekDay Sat = false | isWeekDay Sun = false | isWeekDay _ = true; You can use the data constructors in patterns In this simple case, they are like constants But we will see more general cases next Chapter Eleven Modern Programming Languages, 2nd ed. 8

  9. Outline Enumerations Data constructors with parameters Type constructors with parameters Recursively defined type constructors Farewell to ML Chapter Eleven Modern Programming Languages, 2nd ed. 9

  10. Wrappers You can add a parameter of any type to a data constructor, using the keyword of: datatype exint = Value of int | PlusInf | MinusInf; In effect, such a constructor is a wrapper that contains a data item of the given type Value 38 PlusInf Value 36 Some things of type exint: MinusInf Value 26 Chapter Eleven Modern Programming Languages, 2nd ed. 10

  11. - datatype exint = Value of int | PlusInf | MinusInf; datatype exint = MinusInf | PlusInf | Value of int - PlusInf; val it = PlusInf : exint - MinusInf; val it = MinusInf : exint - Value; val it = fn : int -> exint - Value 3; val it = Value 3 : exint Value is a data constructor that takes a parameter: the value of the int to store It looks like a function that takes an int and returns an exint containing that int Chapter Eleven Modern Programming Languages, 2nd ed. 11

  12. A Value Is Not An int - val x = Value 5; val x = Value 5 : exint - x+x; Error: overloaded variable not defined at type symbol: + type: exint Value 5 is an exint It is not an int, though it contains one How can we get the int out again? By pattern matching Chapter Eleven Modern Programming Languages, 2nd ed. 12

  13. Patterns With Data Constructors - val (Value y) = x; val y = 5 : int To recover a data constructor s parameters, use pattern matching So Value is no ordinary function: ordinary functions can't be pattern-matched this way Note that this example only works because x actually is a Value here Chapter Eleven Modern Programming Languages, 2nd ed. 13

  14. An Exhaustive Pattern - val s = case x of = PlusInf => "infinity" | = MinusInf => "-infinity" | = Value y => Int.toString y; val s = "5" : string An exint can be a PlusInf, a MinusInf, or a Value Unlike the previous example, this one says what to do for all possible values of x Chapter Eleven Modern Programming Languages, 2nd ed. 14

  15. Pattern-Matching Function - fun square PlusInf = PlusInf = | square MinusInf = PlusInf = | square (Value x) = Value (x*x); val square = fn : exint -> exint - square MinusInf; val it = PlusInf : exint - square (Value 3); val it = Value 9 : exint Pattern-matching function definitions are especially important when working with your own datatypes Chapter Eleven Modern Programming Languages, 2nd ed. 15

  16. Exception Handling (A Peek) - fun square PlusInf = PlusInf = | square MinusInf = PlusInf = | square (Value x) = Value (x*x) = handle Overflow => PlusInf; val square = fn : exint -> exint - square (Value 10000); val it = Value 100000000 : exint - square (Value 100000); val it = PlusInf : exint Patterns are also used in ML for exception handling, as in this example We ll see it in Java, but skip it in ML Chapter Eleven Modern Programming Languages, 2nd ed. 16

  17. Outline Enumerations Data constructors with parameters Type constructors with parameters Recursively defined type constructors Farewell to ML Chapter Eleven Modern Programming Languages, 2nd ed. 17

  18. Type Constructors With Parameters Type constructors can also use parameters: datatype 'a option = NONE | SOME of 'a; The parameters of a type constructor are type variables, which are used in the data constructors The result: a new polymorphic type SOME 1.5 SOME "Hello" SOME "world" NONE SOME 123.4 NONE Values of type string option Values of type real option Chapter Eleven Modern Programming Languages, 2nd ed. 18

  19. Parameter Before Name - SOME 4; val it = SOME 4 : int option - SOME 1.2; val it = SOME 1.2 : real option - SOME "pig"; val it = SOME "pig" : string option Type constuctor parameter comes before the type constructor name: datatype 'a option = NONE | SOME of 'a; We have types 'a option and int option, just like 'a list and int list Chapter Eleven Modern Programming Languages, 2nd ed. 19

  20. Uses For option Predefined type constructor in ML Used by predefined functions (or your own) when the result is not always defined - fun optdiv a b = = if b = 0 then NONE else SOME (a div b); val optdiv = fn : int -> int -> int option - optdiv 7 2; val it = SOME 3 : int option - optdiv 7 0; val it = NONE : int option Chapter Eleven Modern Programming Languages, 2nd ed. 20

  21. Longer Example: bunch datatype 'x bunch = One of 'x | Group of 'x list; An 'x bunch is either a thing of type 'x, or a list of things of type 'x As usual, ML infers types: - One 1.0; val it = One 1.0 : real bunch - Group [true,false]; val it = Group [true,false] : bool bunch Chapter Eleven Modern Programming Languages, 2nd ed. 21

  22. Example: Polymorphism - fun size (One _) = 1 = | size (Group x) = length x; val size = fn : 'a bunch -> int - size (One 1.0); val it = 1 : int - size (Group [true,false]); val it = 2 : int ML can infer bunch types, but does not always have to resolve them, just as with list types Chapter Eleven Modern Programming Languages, 2nd ed. 22

  23. Example: No Polymorphism - fun sum (One x) = x = | sum (Group xlist) = foldr op + 0 xlist; val sum = fn : int bunch -> int - sum (One 5); val it = 5 : int - sum (Group [1,2,3]); val it = 6 : int We applied the + operator (through foldr) to the list elements So ML knows the parameter type must be int bunch Chapter Eleven Modern Programming Languages, 2nd ed. 23

  24. Outline Enumerations Data constructors with parameters Type constructors with parameters Recursively defined type constructors Farewell to ML Chapter Eleven Modern Programming Languages, 2nd ed. 24

  25. Recursively Defined Type Constructors The type constructor being defined may be used in its own data constructors: datatype intlist = INTNIL | INTCONS of int * intlist; INTCONS INTNIL INTCONS INTNIL 2 the empty list 1 Some values of type intlist: INTCONS INTNIL 1 the list [1,2] the list [1] Chapter Eleven Modern Programming Languages, 2nd ed. 25

  26. Constructing Those Values - INTNIL; val it = INTNIL : intlist - INTCONS (1,INTNIL); val it = INTCONS (1,INTNIL) : intlist - INTCONS (1,INTCONS(2,INTNIL)); val it = INTCONS (1,INTCONS (2,INTNIL)) : intlist INTCONS INTNIL INTCONS INTNIL 2 the empty list 1 INTCONS INTNIL 1 the list [1,2] the list [1] Chapter Eleven Modern Programming Languages, 2nd ed. 26

  27. An intlist Length Function fun intlistLength INTNIL = 0 | intlistLength (INTCONS(_,tail)) = 1 + (intListLength tail); fun listLength nil = 0 | listLength (_::tail) = 1 + (listLength tail); A length function Much like you would write for native lists Except, of course, that native lists are not always lists of integers Chapter Eleven Modern Programming Languages, 2nd ed. 27

  28. Parametric List Type datatype 'element mylist = NIL | CONS of 'element * 'element mylist; A parametric list type, almost like the predefined list ML handles type inference in the usual way: - CONS(1.0, NIL); val it = CONS (1.0,NIL) : real mylist - CONS(1, CONS(2, NIL)); val it = CONS (1,CONS (2,NIL)) : int mylist Chapter Eleven Modern Programming Languages, 2nd ed. 28

  29. Some mylist Functions fun myListLength NIL = 0 | myListLength (CONS(_,tail)) = 1 + myListLength(tail); fun addup NIL = 0 | addup (CONS(head,tail)) = head + addup tail; This now works almost exactly like the predefined list type constructor Of course, to add up a list you would use foldr Chapter Eleven Modern Programming Languages, 2nd ed. 29

  30. A foldr For mylist fun myfoldr f c NIL = c | myfoldr f c (CONS(a,b)) = f(a, myfoldr f c b); Definition of a function like foldr that works on 'a mylist Can now add up an int mylist x with: myfoldr (op +) 0 x One remaining difference: :: is an operator and CONS is not Chapter Eleven Modern Programming Languages, 2nd ed. 30

  31. Defining Operators (A Peek) ML allows new operators to be defined Like this: - infixr 5 CONS; infixr 5 CONS - 1 CONS 2 CONS NIL; val it = 1 CONS 2 CONS NIL : int mylist Chapter Eleven Modern Programming Languages, 2nd ed. 31

  32. Polymorphic Binary Tree datatype 'data tree = Empty | Node of 'data tree * 'data * 'data tree; Node 2 Empty Empty Empty the empty tree Some values of type int tree: the tree 2 Node Node 3 Empty Node 1 2 Empty Empty Empty the tree 2 1 3 Chapter Eleven Modern Programming Languages, 2nd ed. 32

  33. Constructing Those Values - val treeEmpty = Empty; val treeEmpty = Empty : 'a tree - val tree2 = Node(Empty,2,Empty); val tree2 = Node (Empty,2,Empty) : int tree - val tree123 = Node(Node(Empty,1,Empty), = 2, = Node(Empty,3,Empty)); Chapter Eleven Modern Programming Languages, 2nd ed. 33

  34. Increment All Elements fun incall Empty = Empty | incall (Node(x,y,z)) = Node(incall x, y+1, incall z); - incall tree123; val it = Node (Node (Empty,2,Empty), 3, Node (Empty,4,Empty)) : int tree Chapter Eleven Modern Programming Languages, 2nd ed. 34

  35. Add Up The Elements fun sumall Empty = 0 | sumall (Node(x,y,z)) = sumall x + y + sumall z; - sumall tree123; val it = 6 : int Chapter Eleven Modern Programming Languages, 2nd ed. 35

  36. Convert To List (Polymorphic) fun listall Empty = nil | listall (Node(x,y,z)) = listall x @ y :: listall z; - listall tree123; val it = [1,2,3] : int list Chapter Eleven Modern Programming Languages, 2nd ed. 36

  37. Tree Search fun isintree x Empty = false | isintree x (Node(left,y,right)) = x=y orelse isintree x left orelse isintree x right; - isintree 4 tree123; val it = false : bool - isintree 3 tree123; val it = true : bool Chapter Eleven Modern Programming Languages, 2nd ed. 37

  38. Outline Enumerations Data constructors with parameters Type constructors with parameters Recursively defined type constructors Farewell to ML Chapter Eleven Modern Programming Languages, 2nd ed. 38

  39. That's All That s all the ML we will see There is, of course, a lot more A few words about the parts we skipped: records (like tuples with named fields) arrays, with elements that can be altered references, for values that can be altered exception handling Chapter Eleven Modern Programming Languages, 2nd ed. 39

  40. More Parts We Skipped support for encapsulation and data hiding: structures: collections of datatypes, functions, etc. signatures: interfaces for structures functors: like functions that operate on structures, allowing type variables and other things to be instantiated across a whole structure Chapter Eleven Modern Programming Languages, 2nd ed. 40

  41. More Parts We Skipped API: the standard basis predefined functions, types, etc. Some at the top level but most in structures: Int.maxInt, Real.Math.sqrt, List.nth, etc. Chapter Eleven Modern Programming Languages, 2nd ed. 41

  42. More Parts We Skipped eXene: an ML library for applications that work in the X window system the Compilation Manager for building large ML projects Other dialects besides Standard ML Ocaml F# (in Visual Studio, for the .NET platform) Concurrent ML (CML) extensions Chapter Eleven Modern Programming Languages, 2nd ed. 42

  43. Functional Languages ML supports a function-oriented style of programming If you like that style, there are many other languages to explore, like Lisp and Haskell Chapter Eleven Modern Programming Languages, 2nd ed. 43

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#