2014-09-12 11 views
9

Korzystając z biblioteki czasu (czas-1,5), mam stałą, np. 1 sekunda. Nie widzę sposobu, aby utworzyć NominalDiffTime, więc stworzyliśmy difftime:Jak przekonwertować DiffTime na NominalDiffTime?

twoSeconds = secondsToDiffTime 2 

teraz chciałbym do interakcji z UTCTime:

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

Co oczywiście nie wpisz check, ponieważ addUTCTime oczekuje wartości NominalDiffTime w argumencie 1, a ja przerzuciłem DiffTime. Jak przekonwertować między tymi dwoma typami? Lub w jaki sposób mogę utworzyć NominalDiffTime 2 sekundy?

Odpowiedz

14

NominalDiffTime i DiffTime oba mają RealFrac przykładów i w ten sposób oba Fractional i Real przypadkach.

można przekształcić jeden z nich na drugą przez

fromRational . toRational 

który typ (Real a, Fractional c) => a -> c. Jest to bardzo powszechne zadanie i jest dostępne w wersji standard prelude.

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

DiffTime i NominalDiffTime oba mają Num i Fractional przykłady. Oznacza to, że możesz użyć zarówno integer and floating literals zamiast jednego z nich. Wszystkie poniższe prace bez dodatkowej ceremonii.

addUTCTime (-2) 
addUTCTime 600 
addUTCTime 0.5 
+3

'toRational' może potencjalnie być bardzo kosztowną operacją, ponieważ musi obliczyć' gcd' dla licznika i mianownika. Będzie to również działać: 'fromIntegral. diffTimeToPicoseconds :: DiffTime -> NominalDiffTime'. – Mikkel

13

Od NominalDiffTime jest instancją Num, można utworzyć ją za pomocą fromInteger.

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

Z powodu działania literałów numerycznych można po prostu napisać '1 :: NominalDiffTime'. '1' ma już typ' Num a => a'. http://www.haskell.org/onlinereport/basic.html#numeric-literals – Cirdec

+0

Tak, masz rację. Właśnie myślałem o konwersji z niedosłownej liczby całkowitej. Dziękuję za wskazanie tego. – snak