Functors are dependent function types
module type MAP = sig
type key
type 'a map
val empty : 'a map
val lookup : key -> 'a map -> 'a option
val insert : key -> 'a -> 'a map -> 'a map
end
module LambdaMap (Eq : EQ) : MAP = struct
type key = Eq.t
type 'a map = key -> 'a option
let empty = fun _ -> None
let lookup k m = m k
let insert k v m = fun k' => if Eq.eq k k' then v else m k'
end