我参加聚会有点晚了,但这是另一种方法。它的工作原理与其他解决方案略有不同,但最终结果是相同的。
import Data.Map (insert, empty)
import Data.List (foldl')
import Control.Applicative ((<$>))
import Control.Monad (forM)
imageNames = ["background", "gun", "man"]
images = foldl' (flip id) empty <$> forM imageNames (\name ->
insert name <$> loadImage (name ++ ".png")
)
它的作用是images
构建一个insert
等待在Map
. 然后它用于通过操作列表对foldl'
a 进行线程化。随着折叠的进行,它使用操作来构建一个越来越大的所需值。换句话说,这不会构建一个中介,然后将其转换为.Map
insert
insert
Map
[(String, Image)]
Map String Int
用andIO
从loadImage
外部函数一直传递到,给出结果类型。<$>
sequence
IO (Map String Image)
我认为其他解决方案更容易阅读(并且可能也更有效),所以我推荐其中一个。我只是想把这个扔出去。