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

Haskell 遍历后,Data.IntMap.Strict如何保持严格?,haskell,Haskell,: 请注意,函子、可遍历实例和数据实例是相同的 至于Data.IntMap.Lazy模块,如果在严格的 映射,生成的映射将是惰性的 我使用IntMap.traverseWithKey(Functor f=>Applicative f),因为我想要一个mapWithKey和一个不存在的mapWithKey。相反,我在严格映射上使用向后函子。在应用程序使用后,如何保持映射的严格性?您可以使用mapAccumWithKey和mapAccumWithKey,而无需使用累加器参数。优化后,它很可能与map

:

请注意,函子、可遍历实例和数据实例是相同的 至于Data.IntMap.Lazy模块,如果在严格的 映射,生成的映射将是惰性的


我使用
IntMap.traverseWithKey
Functor f=>Applicative f
),因为我想要一个
mapWithKey
和一个不存在的
mapWithKey
。相反,我在严格映射上使用
向后
函子。在应用程序使用后,如何保持映射的严格性?

您可以使用
mapAccumWithKey
mapAccumWithKey
,而无需使用累加器参数。优化后,它很可能与
mapWithKey
函数的速度一样快

编辑:如果您正在进行一元遍历,并且希望使可能产生的
IntMap
-s严格,那么可以通过在一元操作中返回严格值来实现

import Data.IntMap.Strict
import Control.Applicative

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

遍历(\n->Just(n+100))m
返回包含
n+100
thunks的
Just m
映射<代码>遍历(\n->Just$!n+100)m返回一个包含已计算的
Int
-s的映射。同样,使用
return$!x
在其他单子中,以获得严格的结果

您可以使用
mapAccumWithKey
mapAccumWithKey
。只需忽略累加器。@AndrásKovács,只需一个未使用的累加器?据我所知,您希望在类型
Applicative t=>(Key->a->Backwards tb)->IntMap a->Backwards t(IntMap b)
处使用
traverseWithKey
Applicative(Backwards f)
实例应该与
Applicative f
实例一样严格,因为Backwards是一种新类型。不管怎样,traverseWithKey对于惰性和严格映射都是一样的,所以您应该没有问题。请注意,这不会以相反的顺序遍历IntMap结构,只有应用程序实例的效果将以相反的顺序组合。您可能正在寻找
mapAccumRWithKey
@user2407038是的,您是对的。以相反的顺序访问是一种性能优化,我不会倒退。不管怎样,我都需要按照你和安德拉斯·科瓦茨的建议去做。谢谢@安德拉斯科瓦茨把你的评论作为回答,我会把它标记为回答。