2014-09-12 28 views
9

Zaman kitaplığını (time-1.5) kullanarak, bir sabit var, ör. 1 saniye. Bir NominalDiffTime oluşturmak için bir yol göremiyorum, bu yüzden bir Farklı Zmn yarattık:DiffTime'ı NominalDiffTime'a nasıl dönüştürebilirim?

twoSeconds = secondsToDiffTime 2 

Şimdi istediğiniz bir UTCTime ile etkileşim:

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

tabii değildir addUTCTime, 1 numaralı argümanda bir NominalDiffTime beklediğinden ve bir DiffTime'ı geçtiğinden kontrol edin. İki tip arasında nasıl dönüşümü yaparım? Ya da 2 saniyelik bir NominalDiffTime nasıl oluşturabilirim?

cevap

14

NominalDiffTime ve DiffTime hem böylece RealFrac örnekleri ve her ikisi de Fractional ve Real örnekler vardır.

Sen (Real a, Fractional c) => a -> c tip vardır

fromRational . toRational 

tarafından diğerine bunlardan birini dönüştürebilirsiniz. Bu, yapılması gereken çok yaygın bir şeydir ve standard prelude numaralı telefondan sağlanır.

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

DiffTime ve NominalDiffTime hem Num ve Fractional örneği var. Bu, integer and floating literals'u ikisinden birinin yerine kullanabileceğiniz anlamına gelir. Aşağıdakilerin tümü herhangi bir ek tören olmadan çalışır.

addUTCTime (-2) 
addUTCTime 600 
addUTCTime 0.5 
+3

'toRational', potansiyel olarak çok pahalı bir işlem olabilir, çünkü pay ve payda için gcd değerini hesaplaması gerekir. Bu da işe yarayacak: 'fromIntegral. diffTimeToPicoseconds :: DiffTime -> NominalDiffTime'. – Mikkel

13

NominalDiffTime, Num örneğinden beri, fromInteger ile oluşturabilirsiniz.

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

Sayısal değişmezler nasıl çalıştığı için "1 :: NominalDiffTime" yazabilirsiniz. '1' zaten' Num a => a' türüne sahiptir. http://www.haskell.org/onlinereport/basic.html#numeric-literals – Cirdec

+0

Evet, haklısınız. Sadece tam olmayan tam sayıdan dönüştürmeyi düşünüyordum. Bunu işaret ettiğin için teşekkürler. – snak

İlgili konular