除了freezeST之外,还有一种更有效的方法是使用STStrMap中的值来获取StrMap吗?例如,我有一个包含一堆函数的STStrMap。在某些时候,我想调用所有函数,返回第一个Just值。此代码有效:
runOpeners uri omap = do
strmap <- omap >>= \omap' -> freezeST omap' -- convert from STStrMap to StrMap
pure $ foldl (\acc o -> acc <|> o uri ) Nothing $ values strmap -- call opener functions
但是,freezeST首先复制地图,效率很低。