我参加聚会有点晚了,但这是另一种方法。它的工作原理与其他解决方案略有不同,但最终结果是相同的。
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 进行线程化。随着折叠的进行,它使用操作来构建一个越来越大的所需值。换句话说,这不会构建一个中介,然后将其转换为.MapinsertinsertMap[(String, Image)]Map String Int
用andIO从loadImage外部函数一直传递到,给出结果类型。<$>sequenceIO (Map String Image)
我认为其他解决方案更容易阅读(并且可能也更有效),所以我推荐其中一个。我只是想把这个扔出去。