2015-12-11 17 views
6

Sto leggendo il libro Real World OCaml e ho ricevuto un errore con il codice di quel libro. Dato che non vedo alcuna attività sui problemi del libro in GitHub, vorrei chiederti qui. Ecco il problema COBE:Conversione del tempo in secondi con il numero di stringa

let log_entry maybe_time message = 
    let time = match maybe_time with 
     | Some x -> x 
     | None -> Time.now() 
    in 
    Time.to_sec_string time^" -- "^message 
;; 

E l'errore è il prossimo:

Error: This expression has type zone:Core.Zone.t -> string but an expression was expected of type string 

quanto ho capito si tratta di chiamare

tempo Time.to_sec_string

+0

Come ho capito, il problema è che Tmie.to_sec_string tempo restituisce la funzione non una stringa. –

+1

Sembra che la funzione sia aggiornata e ora ha un argomento extra di 'zone: Core.Zone.t'. Devi applicare alcuni dati del fuso orario 'z' come' TIme.to_sec_string ~ zone: z time' – camlspotter

risposta

9

Nella versione precedente di libreria di base della funzione to_sec_string ha avuto la seguente interfaccia:

(** [to_sec_string t] Same as to_string, but without milliseconds *) 
val to_sec_string : t -> string 

Ad un certo punto del tempo hanno cambiato la sua interfaccia e ora è

(** Same as [to_string_abs], but without milliseconds *) 
val to_sec_string : t -> zone:Zone.t -> string 

Ciò significa, che ora questa è una funzione con due parametri. Il primo è ancora un valore di tipo Time.t, ma il secondo è un argomento labeled di tipo Zone.t che specifica un fuso orario. Un parametro con etichetta, a differenza di un normale parametro posizionale, può essere passato a una funzione in posizione arbitraria, in modo che non sia necessario ricordare l'ordine degli argomenti. Un solita invocazione sarà simile a questa:

let s = Time.to_sec_string time ~zone:Time.Zone.local 

dove Time.Zone.local è un oggetto di fuso orario, che rappresenta il fuso orario locale. Poiché si tratta di un parametro etichettato, si può anche chiamare la funzione come questa:

let s = Time.to_sec_string ~zone:Time.Zone.local time 

Inoltre, dal momento che entrambi i parametri qui hanno tipi differenti, OCaml può anche indovinare chi è che senza usare l'etichetta, in modo da poter fallback a argomenti posizionali:

let s = Time.to_sec_string time Time.Zone.local 

Infine, la maggior parte dei tipi di nucleo ha in là funzione di interfaccia to_string. Quindi una soluzione più semplice sarebbe quella di usarlo, invece di to_sec_string. Ha un formato leggermente diverso e più dettagliato, però:

Time.to_string time^" -- "^message 
5

Ho trovato una discussione su questo problema nello GitHub

La soluzione è quello di aggiungere:

Time.to_sec_string ~zone:Core.Zone.local (time)^" -- "^message 

Anche se, non capisco come funziona.

+0

Time.to_sec_string ~ zone: Core.Zone.local (time): restituisce una stringa che tiene il tempo. Quella stringa viene quindi concatenata con e messaggio (da thx a^"-"^messaggio) –

Problemi correlati