在遍历之后,Data.IntMap.Strict如何保持严格?

时间:2015-04-01 18:04:29

标签: haskell

Data.IntMap.Strict docs say

  

请注意Functor,Traversable和Data实例是相同的   至于Data.IntMap.Lazy模块,所以如果它们在严格使用   地图,生成的地图将是懒惰的。

我使用IntMap.traverseWithKeyFunctor f => Applicative f),因为我想要一个不存在的mapWithKeymaprWithKey。相反,我在严格的地图上使用Backwards仿函数。在申请使用后如何严格保持地图?

1 个答案:

答案 0 :(得分:4)

您可以使用mapAccumWithKeymapAccumRWithKey,而无需使用累加器参数。优化后,它最有可能与mapWithKey函数完全一样快。

编辑:如果你正在进行monadic遍历,并希望使得IntMap - s严格,那么你可以通过在monadic动作中返回严格的值来实现这一点。

import Data.IntMap.Strict
import Control.Applicative

m :: IntMap Int
m = fromList $ zip [0..] (replicate 10 0)

traverse (\n -> Just (n + 100)) m会返回包含Just m个thunk的n + 100地图。 traverse (\n -> Just $! n + 100) m会返回包含已评估Int - s的地图。同样,在其他monad中使用return $! x来获得严格的结果。