在 Haskell IO Monads 中读取文件

reading files in Haskell IO Monads

大家好我是Haskell的初学者,我有一个包含

的dat文件
[("img0.bmp", [0,0])
,("img1.bmp", [0,1])
,("img2.bmp", [1,0])
,("img3.bmp", [1,1])]

字符串是文件夹中的图像文件,所以基本上我需要读取包含许多文件的文件作为输入,我试图在最后 [([Double],[Double])] 从 bmp 文件中提取矩阵然后把它变成 [Double]

我试过这样的东西

learnbmp = do
 vs <- getArgs
 df <- run (readFile (vs!!0))
 let ds = Prelude.read df :: [(String,[Double])]
 let ns = Prelude.unzip ds 

 --let a =  Prelude.map (\(v) -> toUnboxed  (readImageFromBMPa v))(fst ns)
 let a =  fst ns
 let b = snd ns 
 --let n' =  Prelude.map (\(v) -> ((readMatrixfromImage v) ) ) a
 let n' =  Prelude.map (\(v) -> ((readMatrixfromImage v) ) ) a

 let final = Prelude.zip n' b 
 
 return final

final 的类型是

final :: [(IO (Vector Word8), [Double])]

函数 readMatrixfromImage 定义如下

readMatrixfromImage :: FilePath -> IO (Vector Word8)
readMatrixfromImage image = do 
       x <- readImageFromBMPa image -- 'x' est alors de type t
       let (Right r) = x
       let a = toUnboxed r
       return a

任何帮助将不胜感激谢谢

如果你想在 IO monad 中获得“包装”的结果,你可以使用 mapM :: (Monad m, Traversable t) => (a -> m b) -> t a -> m (t b):

learnbmp :: IO [([Double],[Double])]
learnbmp = do
    (v0:_) <- getArgs
    df <- run (readFile v0)
    let (a, b) = Prelude.unzip (Prelude.read df :: [(String,[Double])])
    (`Prelude.zip` b) <$> <b>mapM</b> readMatrixfromImage a

这里 learnbmp 的类型是 IO [([Double], [Double])]。因此,它是一个 IO 操作,将导致 [([Double], [Double])] 类型的项,因此您可以在其他表达式中使用 learnbmp,导致 IO a 类型,例如 main.