根据 Haskell 中的时间戳将数组拆分为块

Split array into chunks based on timestamp in Haskell

我在 Haskell 中有一组记录(自定义数据类型),我想根据每条记录的时间戳对其进行聚合。笼统地说,每条记录如下所示:

data Record = Record { event :: String, 
                       time :: Double, 
                       from :: Int, 
                       to :: Int 
                     } deriving (Show, Eq)

我使用双精度作为时间戳,因为它与跟踪文件中使用的格式相同。

然后我将它们从 CSV 文件解析为记录数组:[Record]

现在我正在寻找瞬时事件/时间的近似值。所以我想根据时间戳(比如每 1 秒)将数组拆分成几个数组,然后折叠每个较小的数组。

问题是我不知道如何根据记录的值拆分数组。查看 Hoogle 我发现了几个函数,例如 splitEverysplitWhen,但我迷路了。我考虑过在 (mod time 0.1) == 0 时使用 splitWhen 来分解列表,但即使这样做可行,它也会删除它拆分的元素(我不想这样做)。

我要注意记录的时间间隔不均匀。例如。顺序记录上的时间戳不会相差固定数量。

如果您能推荐一种可以简化此类工作的格式,我非常愿意以其他格式存储数据。

我正在解析的数据的快速示例(来自 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

如果你有 [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