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