let rec explicit_or_implicit p e =
  match p with
    | PTypeConstraint (pos, p, typ) ->
        explicit_or_implicit p (ETypeConstraint (pos, e, typ))
          
    | PVar (_, name) -> (
        try
          let typ, e = extract_type e in
            Explicit (name, typ, e)
        with Not_found ->
          Implicit (name, e)
      )

    | _ -> NotPVar