文章标题
来源:互联网 发布:电话销售数据 编辑:程序博客网 时间:2024/06/07 01:57
Assignment
Define a tree datatype, tree, where a leaf has an integer label and an interior node has an
integer label and two child trees. For example,
- node (5, leaf 6, leaf 7);val it = node (5,leaf 6,leaf 7) : tree
This definition should be one line of code.
Basic Sample
ML has higher order functions
- fun h f x = f (x+1) * 2 ;val h = fn : (int -> int) -> int -> int- fun h f x = f x * 2 ; (* h is polymorphic *)val h = fn : ('a -> int) -> 'a -> int
Defining map. Note that it is polymorphic
- fun map f [] = []= | map f (z::zs) = f z :: map f zs ;val map = fn : ('a -> 'b) -> 'a list -> 'b list- (* What is the type of the compose function? *)- fun compose f g x = f (g x) ;val compose = fn : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b
LAMBDA expressions are written: fn =>
- fn x => x + 1 ;val it = fn : int -> int- (fn x => x + 1) 7 ;val it = 8 : int- fun f x = fn y => x + y ;val f = fn : int -> int -> int- f 5 7 ;val it = 12 : int- (* tuples can be used in patterns *)- val x = (3, "hello") ;val x = (3,"hello") : int * string- fun foo (y,z) = if y = 3 then z else "no" ;val foo = fn : int * string -> string- foo x ;val it = "hello" : string- [] ; (* Not a function, but is polymorphic! *)val it = [] : 'a list- fun f x = x ; (* The identity function is the only terminating function of type 'a -> 'a *)val f = fn : 'a -> 'a- fun g x = if true then g x else x ; (* Here's a non-terminating function of type 'a -> 'a *)val g = fn : 'a -> 'a
Sometimes, you need to declare the types of parameters. For example, you might need to specify the parameter is a real rather than an int
- fun f (x:real) y = x + y ;val f = fn : real -> real -> real
Patterns can be used in variable definitions, allowing for simultanenous variable definitions
- val (x,y) = (4, 3.5) ;val x = 4 : intval y = 3.5 : real- val (x::xs) = [1,2,3,4] ;val x = 1 : intval xs = [2,3,4] : int list
Defining nested variables and functions using a let
- fun g x == let val y = x * 2= fun h z = z * y= in h x = end ;val g = fn : int -> int
For mutually recursive functions, use “and”
- fun f x = if x = 0 then 1 else x * g (x-1)= and = g 0 = 1= | g n = n * f (n-1)= ;val f = fn : int -> intval g = fn : int -> int
The boolean operators are “andalso” and “orelse”
- true andalso false ;val it = false : bool- true orelse false ;val it = true : bool
Defining a new type using “datatype”, enumerating all the elements of the new type
- datatype stoplight = red | green | yellow ;datatype stoplight = green | red | yellow- red ;val it = red : stoplight
These values can be used as patterns
- fun drive red = "stop"= | drive green = "go"= | drive yellow = "go faster" ;val drive = fn : stoplight -> string
Associating values with each alternative in a datatype declaration
- datatype vehicle = car of int | truck of bool | boat of int list ;datatype vehicle = boat of int list | car of int | truck of bool- (* car needs to take an integer value as a parameter *)- car 6 ;val it = car 6 : vehicle- truck true; (* truck needs a boolean value *)val it = truck true : vehicle- boat [1,2,3]; (* boat needs an int list *)val it = boat [1,2,3] : vehicle
Can also use these in patterns to define functions
- fun silly (car x) = x*2= | silly (truck y) = if y then 3 else 4= | silly (boat z) = length z ;val silly = fn : vehicle -> int- silly (car 7) ;val it = 14 : int- silly (boat [1,2,3,4]) ;val it = 4 : int
Datatypes can be recursive! That is, the type you’re defining can appear on the right hand side of the definition
- datatype tree = leaf of int | node of tree * tree ;datatype tree = leaf of int | node of tree * tree
Constructing a tree
- val mytree = node (node (leaf 3, leaf 4), leaf 5) ;val mytree = node (node (leaf 3,leaf 4),leaf 5) : tree
Fringe returns a list of the labels associated with the leaves of a tree
- fun fringe (leaf x) = [x]= | fringe (node (left,right)) = fringe left @ fringe right ;val fringe = fn : tree -> int list- fringe mytree ;val it = [3,4,5] : int list
Datatypes can be polymorphic
- datatype 'a tree = leaf of 'a | node of 'a tree * 'a tree ;datatype 'a tree = leaf of 'a | node of 'a tree * 'a tree- leaf 5 ;val it = leaf 5 : int tree- leaf ["hello"] ;val it = leaf ["hello"] : string list tree
Use the same definition of fringe as above. Now it’s polymorphic!
- fun fringe (leaf x) = [x]= | fringe (node (left,right)) = fringe left @ fringe right ;val fringe = fn : 'a tree -> 'a list
Using infix operators as functions
- (op +)(3,4) ;val it = 7 : int- fun f g = g(3,4) ;val f = fn : (int * int -> 'a) -> 'a- f (op +) ;val it = 7 : int
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- SDL2 更改窗口大小,视频卡主
- thrift的使用(1)
- git 合并分支时出现的异常解决方案----蓝字,提示输入提交信息的
- c++第四次上机作业
- 凸优化工具包CVX的安装注册
- 文章标题
- 欢迎使用CSDN-markdown编辑器
- 并发(Concurrency). VS 并行(Parallelism).
- 括号匹配算法
- Angular2 指令—自定义指令
- 微信小程序开发者常见FAQ之二
- wtc6508bsi,键释放引发的问题分析及解决
- tf.cast
- Large Margin Object Tracking with Circulant Feature Maps