我想在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
,那么它工作正常。我在这里错过了一些概念吗?任何帮助将不胜感激。
答案 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
可以推断10
到POSIXTime
。但是当您提供具有已定义类型Int
的变量时,编译器无法匹配类型。