我在Haskell中有一个记录数组(自定义数据类型),我希望根据每个记录的时间戳来聚合。一般来说,每条记录都是这样的:
data Record = Record { event :: String,
time :: Double,
from :: Int,
to :: Int
} deriving (Show, Eq)
我使用Double作为时间戳,因为它与tracefile中使用的格式相同。
我将它们从CSV文件解析为一系列记录:[Record]
现在我想要获得瞬时事件/时间的近似值。所以我想根据时间戳(例如每1秒)将数组拆分成几个数组,然后在每个较小的数组中折叠。
问题是我无法弄清楚如何根据记录的值拆分数组。看看Hoogle我找到了几个函数,比如splitEvery
和splitWhen
,但我迷路了。我考虑使用splitWhen
来分解列表,比如说(mod time 0.1) == 0
,但即使这样有效,它也会删除它分裂的元素(我不想这样做)。
我应该注意,记录的时间间隔不均匀。例如。顺序记录的时间戳不会有固定的差异。
我非常愿意以不同的格式存储数据,如果您可以建议一种可以使这种工作更轻松的数据。
我正在解析的数据的快速示例(来自ns2模拟):
r 0.114 1 2 tcp 1000 ________ 2 1.0 5.0 0 2
r 0.240 1 2 tcp 1000 ________ 2 1.0 5.0 0 2
r 0.914 2 1 tcp 1000 ________ 2 5.0 1.0 0 3
答案 0 :(得分:2)
如果您有[Record]
,并且希望按特定条件对其进行分组,则可以使用Data.List.groupBy
。我假设您的time :: Double
,1秒是基本单位,因此time = 1
是1秒,time = 100
是100秒等,所以将此调整为您所使用的任何系统实际使用:
import Data.List
import Data.Function (on)
isInSameClockSecond :: Record -> Record -> Bool
isInSameClockSecond = (==) `on` (floor . time :: Record -> Integer)
-- The type signature is given for floor . time to remove any ambiguity
-- due to floor's polymorphic type signature.
groupBySameClockSecond :: [Record] -> [[Record]]
groupBySameClockSecond = groupBy isInSameClockSecond