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

时间:2017-07-24 17:11:52

标签: haskell

我想在haskell中获取UTC时间戳。原始函数getPOSIXTime以秒为单位给出时间戳。我希望它以毫秒和微秒为单位。我写了一个函数来将秒时间戳乘以这样的因子:

-- 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 个答案:

答案 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的变量时,编译器无法匹配类型。