List 在Haskell中按名称加载和存储图像列表的简洁方法是什么?

List 在Haskell中按名称加载和存储图像列表的简洁方法是什么?,list,haskell,List,Haskell,我想使用一堆硬编码名称和现有函数loadImage::String->IO Image加载图像列表(或任何数据结构) 在Lua中,我将执行以下操作: imageNames = {"background", "gun", "man"} images = {} for i,v in ipairs(imageNames) do images[v] = loadImage(v..".png") end 并使用图像.background,图像.man等访问它们。我如何在Haskell中执行此操

我想使用一堆硬编码名称和现有函数
loadImage::String->IO Image
加载图像列表(或任何数据结构)

在Lua中,我将执行以下操作:

imageNames = {"background", "gun", "man"}

images = {}
for i,v in ipairs(imageNames) do
    images[v] = loadImage(v..".png")
end
并使用
图像.background
图像.man
等访问它们。我如何在Haskell中执行此操作?

导入数据.Map
import Data.Map

imageNames :: [String]
imageNames = ["background", "gun", "man"]

images :: [IO (String, Image)]
images = [loadImage(name ++ ".png") >>= return . (,) name | name <- imageNames]

main = do
  imgs <- sequence images
  let imageMap = fromList imgs
  return ()
imageNames::[字符串] imageNames=[“背景”、“枪”、“人”] 图像::[IO(字符串,图像)] images=[loadImage(name++“.png”)>>=return.(,)name | name
import Data.Map
imageNames::[字符串]
imageNames=[“背景”、“枪”、“人”]
图像::[IO(字符串,图像)]

images=[loadImage(name++“.png”)>>=return.(,)name | name基本上正如Ankur所说,我可能不会有一个明确的“images”列表,可能会使用JuicyPixels进行加载:

import Data.Map
import Codec.Picture

images :: [String]
images = ["background", "gun", "man"]

main = do
  imgs <- mapM loadImage images
  let imageMap = fromList (zip images imgs)
  return ()

loadImage :: IO DynamicImage
loadImage = either id (error "Bad Image") `fmap` readImage
导入数据.Map
导入编解码器。图片
图像::[字符串]
图像=[“背景”、“枪”、“人”]
main=do

imgs基本上正如Ankur所说,我可能没有明确的“图像”列表,可能会使用JuicyPixels进行加载:

import Data.Map
import Codec.Picture

images :: [String]
images = ["background", "gun", "man"]

main = do
  imgs <- mapM loadImage images
  let imageMap = fromList (zip images imgs)
  return ()

loadImage :: IO DynamicImage
loadImage = either id (error "Bad Image") `fmap` readImage
导入数据.Map
导入编解码器。图片
图像::[字符串]
图像=[“背景”、“枪”、“人”]
main=do

imgs我参加聚会有点晚了,但这里有另一种方法。它的原理与其他解决方案略有不同,但最终结果是一样的

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")
  )
import Data.Map(插入,空)
导入数据列表(foldl')
导入控件。应用程序(())
导入控制.Monad(表单)
imageNames=[“背景”、“枪”、“人”]
images=foldl'(翻转id)空表单imageNames(\name->
插入名称loadImage(名称++“.png”)
)
images
所做的是,它构建了一个
insert
操作列表,这些操作等待在
Map
上执行。然后它使用
foldl'
insert
操作列表中穿行
Map
。随着折叠的进行,它使用
insert
操作来构建一个更大、更复杂的映射更大的
Map
,具有所需的值。换句话说,这不会构建中介
[(字符串,图像)]
,然后将其转换为
Map String Int

IO
通过
序列
loadImage
一直传送到外部函数,给出结果类型
IO(映射字符串图像)


我认为其他解决方案更容易阅读(可能也更有效),所以我推荐其中一种。我只是想把它扔出去。

我参加聚会有点晚,但这里有另一种方法。它的原理与其他解决方案略有不同,但最终结果是一样的

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")
  )
import Data.Map(插入,空)
导入数据列表(foldl')
导入控件。应用程序(())
导入控制.Monad(表单)
imageNames=[“背景”、“枪”、“人”]
images=foldl'(翻转id)空表单imageNames(\name->
插入名称loadImage(名称++“.png”)
)
images
所做的是,它构建了一个
insert
操作列表,这些操作等待在
Map
上执行。然后它使用
foldl'
insert
操作列表中穿行
Map
。随着折叠的进行,它使用
insert
操作来构建一个更大、更复杂的映射更大的
Map
,具有所需的值。换句话说,这不会构建中介
[(字符串,图像)]
,然后将其转换为
Map String Int

IO
通过
序列
loadImage
一直传送到外部函数,给出结果类型
IO(映射字符串图像)


我认为其他解决方案更容易阅读(而且可能也更有效),所以我推荐其中一个。我只是想把它扔出去。

m>=return.f
=
fm
m>=return.f
=
fm
这很好,但我只想坚持使用SDL的图像。这很好,但我只想坚持使用SDL的图像。