请注意Functor,Traversable和Data实例是相同的 至于Data.IntMap.Lazy模块,所以如果它们在严格使用 地图,生成的地图将是懒惰的。
我使用IntMap.traverseWithKey
(Functor f => Applicative f
),因为我想要一个不存在的mapWithKey
和maprWithKey
。相反,我在严格的地图上使用Backwards
仿函数。在申请使用后如何严格保持地图?
答案 0 :(得分:4)
您可以使用mapAccumWithKey
和mapAccumRWithKey
,而无需使用累加器参数。优化后,它最有可能与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
来获得严格的结果。