我有以下内容:
data Node = Node { position::Int
, zombies::Float
, connections::[Int]
}
moveZombie :: [Node] -> Node -> Node
moveZombie nodes (Node i _ cx) = zc `seq` Node i zc cx
where zc = sum [zombies n / (fromIntegral $ length $ connections n) | i <- cx, let n = nodes !! i]
step :: Int -> [Node] -> [Node]
step 0 nodes = nodes
step k nodes = step (k-1) $ map (moveZombie nodes) nodes
在 GHC 中启用分析的编译告诉我成本中心是:
Individual
COST CENTRE MODULE %time %alloc
moveZombie.zc Main 60.3 90.4
moveZombie.zc.n Main 37.6 0.0
我尝试了以下方法:moveZombie nodes (Node i _ cx) = zc `seq` Node i zc cx
强制进行严格的评估并让程序运行得更快,但完全没有成功。我知道我对工作方式的理解有问题seq
,但我似乎无法弄清楚是什么。
我认为,我需要强制进行严格的评估,step k nodes = step (k-1) $ map (moveZombie nodes) nodes
但是我很困惑。
我知道:
seq a b
在评估时强制a
进入弱第一范式b
- 如果最外面的表达式是 lambda 或 Data 构造函数,则表达式为弱范式
任何指向我缺少什么理解的指针?