Haskell 遍历后,Data.IntMap.Strict如何保持严格?
: 请注意,函子、可遍历实例和数据实例是相同的 至于Data.IntMap.Lazy模块,如果在严格的 映射,生成的映射将是惰性的Haskell 遍历后,Data.IntMap.Strict如何保持严格?,haskell,Haskell,: 请注意,函子、可遍历实例和数据实例是相同的 至于Data.IntMap.Lazy模块,如果在严格的 映射,生成的映射将是惰性的 我使用IntMap.traverseWithKey(Functor f=>Applicative f),因为我想要一个mapWithKey和一个不存在的mapWithKey。相反,我在严格映射上使用向后函子。在应用程序使用后,如何保持映射的严格性?您可以使用mapAccumWithKey和mapAccumWithKey,而无需使用累加器参数。优化后,它很可能与map
我使用
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是的,您是对的。以相反的顺序访问是一种性能优化,我不会倒退。不管怎样,我都需要按照你和安德拉斯·科瓦茨的建议去做。谢谢@安德拉斯科瓦茨把你的评论作为回答,我会把它标记为回答。