Browse thread
type inference problem with Printf.sprintf ?
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2010-10-26 (15:55) |
From: | Emmanuel Dieul <emmanuel.dieul@f...> |
Subject: | type inference problem with Printf.sprintf ? |
Hi everyone. I've just noticed a type inference problem (or am I wrong ?). Here's my example : let format_date = let format_valeur = function valeur -> (if valeur < 10 then "0" else "") ^ (string_of_int valeur) in function date -> Printf.sprintf "%s/%s/%l %s:%s:%s" (format_valeur(date.Unix.tm_mday) : string) (format_valeur(date.Unix.tm_mon + 1) : string) (date.Unix.tm_year + 1900) (format_valeur(date.Unix.tm_hour) : string) (format_valeur(date.Unix.tm_min) : string) (format_valeur(date.Unix.tm_sec) : string) ;; The "format_valeur" function has type "int -> string". The "format_date" function has type "Unix.tm -> string". The problem is about the Printf.sprintf function. In fact, if I don't force the type of every date field (like "(format_valeur(date.Unix.tm_mday) : string)"), the ocaml 3.12.0 compiler detects a type error. This example let format_date = let format_valeur = function valeur -> (if valeur < 10 then "0" else "") ^ (string_of_int valeur) in function date -> Printf.sprintf "%s/%s/%l %s:%s:%s" format_valeur(date.Unix.tm_mday) (format_valeur(date.Unix.tm_mon + 1) : string) (date.Unix.tm_year + 1900) (format_valeur(date.Unix.tm_hour) : string) (format_valeur(date.Unix.tm_min) : string) (format_valeur(date.Unix.tm_sec) : string) ;; generates this error around the "%s/%s/%l %s:%s:%s" string : Error: This expression has type (string -> string -> int -> string -> string -> string -> 'a -> 'b, unit, string, string, string, 'a -> 'b) format6 but an expression was expected of type (string -> string -> int -> string -> string -> string -> 'a -> 'b, unit, string) format = (string -> string -> int -> string -> string -> string -> 'a -> 'b, unit, string, string, string, string) format6 Did I do something wrong or is there a real problem ? Emmanuel