2017-07-24 103 views
0

我想在haskell中獲取UTC時間戳。原始功能getPOSIXTime以秒爲單位給出時間戳。我希望它在毫秒和微秒。我寫了一個函數通過這樣的因素乘以秒時間戳:Haskell無法與Int類型Data.Time.Clock.UTC.NominalDiffTime匹配

-- get timestamp in seconds multiplied by factor 
getTimestampX :: Int -> IO Int 
getTimestampX n = do 
    tstamp <- fmap (truncate . (* n)) getPOSIXTime 
    let str = show tstamp 
     intval = read str :: Int 
    return intval 

然而,這是拋出以下錯誤:

Couldn't match type ‘time-1.6.0.1:Data.Time.Clock.UTC.NominalDiffTime’ 
        with ‘Int’ 
     Expected type: IO Int 
     Actual type: IO POSIXTime 
    • In the second argument of ‘fmap’, namely ‘getPOSIXTime’ 
     In a stmt of a 'do' block: 
     tstamp <- fmap (truncate . (* n)) getPOSIXTime 
     In the expression: 
     do { tstamp <- fmap (truncate . (* n)) getPOSIXTime; 
      let str = show tstamp 
       intval = ...; 
      return intval } 

但是,如果使用類似100,1000的任何整數值代替n然後它工作正常。我在這裏錯過了一些概念嗎?任何幫助,將不勝感激。

+1

'truncate'已經可以返回'Int'。你不需要「展示」,然後「閱讀」它。所以:'getTimestampX n = truncate。 (* fromInteral n)<$> getPOSIXTime'。 (不是因爲這個問題沒有解釋這個問題,而只是解決了這個問題,已經有了一個很好的答案和解釋。) –

+0

我更喜歡這個答案。如果它在答案部分,我會將其標記爲答案。謝謝。 –

回答

1

這是因爲getPOSIXTime回報IO POSIXTime,不IO Int

這一工程:

getTimestampX :: POSIXTime -> IO Int 
getTimestampX n = do 
    tstamp <- fmap (truncate . (* n)) getPOSIXTime 
    let str = show tstamp 
     intval = read str :: Int 
    return intval 

你的情況下,與原號碼的工作,因爲Haskell可以推斷10POSIXTime。但是,當您提供一個定義類型的變量Int時,編譯器無法匹配類型。

+0

感謝您的解決方案和解釋。 –

+0

但是,如果您查看上述問題中的註釋,它也有一個解決方案,即使不使用POSIXTime而不是Int也可以使用。很好的解釋。 –

相關問題