2014-09-12 5 views
9

Unter Verwendung der Zeitbibliothek (Zeit-1,5) habe ich eine Konstante, z. 1 Sekunde. Ich sehe keinen Weg, um eine NominalDiffTime zu schaffen, so habe ich eine DiffTime erstellt:Wie konvertiere ich DiffTime zu NominalDiffTime?

twoSeconds = secondsToDiffTime 2 

Jetzt würde Ich mag mit einem UTCTime zu interagieren:

now <- getCurrentTime 
let twoSecondsAgo = addUTCTime (-twoSeconds) now 

Was natürlich nicht Typprüfung, weil addUTCTime eine NominalDiffTime in Argument 1 erwartet und ich eine DiffTime übergeben habe. Wie konvertiere ich zwischen den beiden Typen? Oder wie kann ich eine NominalDiffTime von 2 Sekunden erstellen?

Antwort

14

NominalDiffTime und DiffTime haben beide RealFrac Instanzen und damit beide Fractional und Real Instanzen.

Sie können

fromRational . toRational 

entweder von ihnen in die andere umwandeln Welche Art (Real a, Fractional c) => a -> c hat. Dies ist eine sehr häufige Sache zu tun, und ist in der standard prelude zur Verfügung gestellt.

realToFrac  :: (Real a, Fractional b) => a -> b 
realToFrac  = fromRational . toRational 

DiffTime und NominalDiffTime haben beide Num und Fractional Instanzen. Dies bedeutet, dass Sie beide integer and floating literals anstelle von beiden verwenden können. Alle folgenden Arbeiten ohne zusätzliche Zeremonie.

addUTCTime (-2) 
addUTCTime 600 
addUTCTime 0.5 
+3

'toRational' kann möglicherweise eine sehr teure Operation sein, weil es' gcd' für Zähler und Nenner berechnen muss. Das wird auch funktionieren: 'fromIntegral. diffTimeToPicoseconds :: DiffTime -> NominalDiffTime'. – Mikkel

13

Da NominalDiffTime eine Instanz von Num ist, können Sie sie mit fromInteger erstellen.

>>> fromInteger 1 :: NominalDiffTime 
1s 
+5

Aufgrund der Funktionsweise numerischer Literale können Sie einfach '1 :: NominalDiffTime' schreiben. '1' hat bereits den Typ' Num a => a'. http://www.haskell.org/onlinereport/basic.html#numeric-literals – Cirdec

+0

Ja, Sie haben Recht. Ich habe gerade über die Konvertierung von nicht-literalen Ganzzahlen nachgedacht. Vielen Dank, dass Sie darauf hingewiesen haben. – snak

Verwandte Themen