Haskell无法与Int类型Data.Time.Clock.UTC.NominalDiffTime匹配

问题描述:

我想在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

我更喜欢这个答案。如果它在答案部分,我会将其标记为答案。谢谢。 –

这是因为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也可以使用。很好的解释。 –