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
然后它工作正常。我在这里错过了一些概念吗?任何帮助,将不胜感激。
答
这是因为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
时,编译器无法匹配类型。
+0
感谢您的解决方案和解释。 –
+0
但是,如果您查看上述问题中的注释,它也有一个解决方案,即使不使用POSIXTime而不是Int也可以使用。很好的解释。 –
'truncate'已经可以返回'Int'。你不需要“展示”,然后“阅读”它。所以:'getTimestampX n = truncate。 (* fromInteral n) getPOSIXTime'。 (不是因为这个问题没有解释这个问题,而只是解决了这个问题,已经有了一个很好的答案和解释。) –
我更喜欢这个答案。如果它在答案部分,我会将其标记为答案。谢谢。 –