module Stack : STACK =
struct
type 'a stack = Empty | Push of ('a * 'a stack)
exception EmptyStack
let new () = Empty
let push s e = Push (e,s)
let pop s =
match s with
Empty -> raise EmptyStack
| Push(x,_) -> x
let empty s =
match s with
Empty -> true
| _ -> false
let rec toList s =
match s with
Empty -> []
| Push(top,bot) -> top :: (toList bot)
let toString f s = String.concat (List.map f (toList s))
end
Problem 2:
Consider the following signatures:
module type NE1 =
sig
type name = string
type expr
type namedExpr = name * expr
val makeExpr : string * (int * int -> int) -> (namedExpr * namedExpr) -> namedExpr
val constExpr : int -> namedExpr
val eval : namedExpr -> int
end
module type NE2 =
sig
type name
type expr
type namedExpr = name * expr
val makeExpr : string * (int * int -> int) -> (namedExpr * namedExpr) -> namedExpr
val constExpr : int -> namedExpr
val eval : namedExpr -> int
end
module type NE3 =
sig
type name
type expr
type namedExpr
val makeExpr : string * (int * int -> int) -> (namedExpr * namedExpr) -> namedExpr
val constExpr : int -> namedExpr
val eval : namedExpr -> int
end
(a) Write down three expressions that Ocaml would accept for a