2015-12-11 18 views
6

Ich lese Buch Real World OCaml und habe Fehler mit Code aus diesem Buch. Da ich in GitHub keine Aktivitäten zu Buchproblemen sehe, möchte ich Sie hier fragen. Hier ist das Problem cobe:Konvertieren Zeit in Sekunden String Ausgabe

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 
;; 

und der Fehler ist der nächste:

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

Wie ich verstehe es geht um Aufruf

Time.to_sec_string Zeit

+0

Wie ich verstehe, ist das Problem, dass Tmie.to_sec_string Zeitfunktion keine Zeichenfolge zurückgibt. –

+1

Es scheint, dass die Funktion aktualisiert wird und jetzt ein zusätzliches Argument von 'zone: Core.Zone.t' hat. Sie müssen einige Zeitzone Daten "z" wie "TIme.to_sec_string ~ Zone: z Zeit" – camlspotter

Antwort

9

In älteren Version der Bibliothek Kern der to_sec_string Funktion hatte die folgende Schnittstelle:

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

An einem gewissen Punkt der Zeit, die sie seine Oberfläche verändert und nun ist es

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

Das bedeutet, dass jetzt Dies ist eine Funktion mit zwei Parametern. Der erste ist immer noch ein Wert vom Typ Time.t, aber der zweite ist ein labeled Argument vom Typ Zone.t, das eine Zeitzone angibt. Ein beschrifteter Parameter kann im Gegensatz zu einem regulären Positionsparameter an einer Funktion an einer beliebigen Position übergeben werden, sodass Sie sich die Reihenfolge der Argumente nicht merken müssen. Eine übliche Invokation wird wie folgt aussehen:

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

wo Time.Zone.local ist eine Zeitzone Objekt, das repräsentiert Ihre lokale Zeitzone. Da es ein markierter Parameter ist, können Sie auch die Funktion wie folgt aufrufen:

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

Da hier beide Parameter verschiedene Typen haben, können OCaml sogar erraten, wer wer ist das Etikett ohne Verwendung, so können Sie Rückgriff auf Positionsargumente:

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

Schließlich haben die meisten Arten in Kernen dort Schnittstelle to_string Funktion. Also eine einfachere Lösung wäre, es anstelle von to_sec_string zu verwenden. Es hat ein bisschen anders und mehr verbirgiges Format, obwohl:

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

Ich fand eine Diskussion über dieses Thema auf der GitHub

Die Lösung ist hinzuzufügen:

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

Obwohl, ich verstehe nicht, wie es funktioniert.

+0

Time.to_sec_string ~ Zone: Core.Zone.local (Zeit): gibt eine Zeichenfolge mit der Zeit. Diese Zeichenfolge wird dann verkettet mit - und message (thx to^"-"^message) –

Verwandte Themen