Download presentation
Presentation is loading. Please wait.
1
Last Time Introduction Course Logistics Introduction to ML Base Types Tuples and Records Functions & Polymorphism See Harper ’ s Intro to ML
2
Today Sign up to be ‘ TA ’ for a week More ML Data types Type abbreviations Exceptions Modules Mathematical Preliminaries Inductive Definitions
3
Using SML/NJ Interactive mode is a good way to start learning and to debug programs, but … Type in a series of declarations into a “.sml ” file Use “ foo.sml ” [opening foo.sml] … Val it = () : unit
4
Larger Projects SML has its own built in interactive “ make ” Pros: It automatically does the dependency analysis for you No crazy makefile syntax to learn Cons: May be more difficult to interact with other languages or tools
5
Compilation Manager % sml -OS.FileSys.chDir “ ~/courses/510/a2 ” ; -CM.make(); looks for “ sources.cm ”, analyzes depdndencies [compiling … ] compiles files in group [wrote … ] saves binaries in./CM/ -CM.make ’ “ myproj/ ” (); specify directory sources.cm c.smlb.smla.sig Group is a.sig b.sml c.sml
6
Lists Lists are defined in two ways: nil : ‘ a list(empty list) :: : ‘ a * ‘ a list -> ‘ a list 3 :: 4 :: 5 :: nil : int list (fn x => x) :: niil : ( ‘ a -> ‘ a) list 3 :: true :: nil : ? Abbreivation : [](empty list) [x,y,z](x :: y :: z :: nil)
7
List Processing Fun length(nil) = 0 l length (x :: l) = 1 + length l Functions over lists are usually defined by case analysis (induction) over the structure of a list. nil. X :: ; Fun | div two nil = 0 || div two (x::nil) = 0 || div two (x :: y :: z) = 1 + | divtwo z
8
List Processing Fun length l = case l of [] => 0 | _ :: l => | + length l; wild card pattern “ don ’ t care ”
9
Other Patterns Fun lessThree x = case x of 0 | 1 | Z => true | z => false Fun first (a,b) = a; Fun snd (a,b) = b; Patterns can be Variables Integer, char, string constants Tuples Records Lists Wild cards And a few other things …
10
Datatypes -datatype bool = true/false Datatypes can carry values: Datatype coin = penny | Nickel | Dime | Quarter | Loonie | Twonie Datatype bill = One | Five | Ten | Twenty Datatype money = Coin of coin | Bill of bill | Forgery of int
11
Datatypes - Fun count money = case money of coin(x) => count_coin x |Bill (b) => count_bill b And count_coin c = case c of Penny => 1 |Nickel => 5 | … And count_bill b = (case b of One =>1 |Two =>2 | … > * 100
12
Pitfalls Datatype coin = penny | nickel; Val c = penny; Case c of nickel => true |Penny => false >? - case Nickel of Penny => true |Nickel => false; >? - case Nickel of Penny => case Nickel of Penny => true | Nickel => false | nickel => true >?
13
Problem Set #1 Datatype digit = One | Two | … Datatype number = D of digit | …
14
Type Abbreviations Type node = int; Type edges = node->node list; Type graph = node list * edges; Fun neighbours((g, n) : graph * node) * let val (_,e) * g in e n end; we may use the fact that the type graph is equivalent to node list * edges
15
Exceptions Exception Head; Fun head nil = raise Head | head x :: +1 = x (head []) handle Head=> 3 Careful again: - :F e, then e2 else e3 handle Head =>3 nil :: nil :: nil :: nil : ( ‘ a list) list [[1,2,3],[3,4,5]]:int list list
16
Modules Signatures Interfaces Structures Implementations Functors Parameterized structures Functions from structures to structures
17
Signatures Signautre QUEUE = signature name sig type ‘ a queue exception Empty val empty : ‘ a queue val insert : ‘ a * ‘ a queue -> ‘ a queue val remove : ‘ a queue -> ‘ a * ‘ a queue end Keywords delimit signature
18
Signature Inclusion Signature QUEUE_EMPTY = sig include QUEUE val is_empty : ‘ a queue -> bool End - equivalent to writing out QUEUE inside QUEUE_EMPTY
19
Using Structures = Queue : Empty; > Queue.Empty : ‘ a Queue.queue - val a = Queue.insert (1,([6,5,4],[1,2,3])); - structure Q – Queue; - Q.insert _. - open Queue; - Empty - Q.Empty
20
Structures Structure Queue = struct type ‘ a queue = ‘ a list * ‘ a list exception Empty val empty = (nil, nil) fun insert (x, q) = … fun remove q = … end Keywords struct … end delimit structure Structure x = … binds X to structure
21
Signature Ascription Recall: Signature QUEUE = sig type ‘ a queue exception Empty val empty : ‘ a queue end Now we ascribe this signature to a structure: Structure Queue :> QUEUE = struct type ‘ a queue = ‘ a list * ‘ a list val empty = (nil, nil) exception Empty … end
22
Signature Ascription Opaque ascription Provides abstract types Structure Queue :> QUEUE = … Transparent ascription A special case of opaque ascription Hides fields but does not make types abstract Structure Queue_E : QUEUE = … SEE Harper, chapters 18-22 for more on modules
23
Data Types A mechanism for declaring a new type and constructors for the new type and patterns for the new type Datatype colour = Red | Blue | Green > Type colour con Red : colour con Blue : colour con Yellow : colour - Red; > Red : colour - fun favourite colour = case colour of Red | Blue -> true | Green -> false;
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.