Haskell:将数据文件读取为计算数组

时间:2016-11-22 13:35:45

标签: haskell

建立

我有一个以下格式的数据文件:每条线上用空格分隔的2D坐标

1.23 4.0
23.7 23.1
60.4 4.2

要解析这个,我做了以下函数(我不介意反馈):它将文件的路径作为字符串,将行和列解析为双精度,

fileData :: String -> IO [[Float]]
fileData str = readFile str >>=
               \file -> return $ map ((map $ \x -> read x::Float) . words $) $ lines file

上面给出的示例文件的输出是IO [[Float]]

[[1.23, 4.0],
[23.7, 23.1],
[60.4, 4.2]]

问题

处理此数组的最佳方法是什么,fileData的输出?例如,如何使用此数组中的值进行计算?最后,我想使用hMatrix来操纵这些值。

要获取数组[1.23, 4.0]的第0个元素,我尝试运行

main :: IO ()
main = fileData "file.txt" >>=
       \file -> print $ (flip (!!) 0) <$> file

但它返回每个子数组[1.23, 23.7, 60.4]的第0个元素,它与数组中 (print $ map (flip (!!) 0))的值匹配,就好像是{{1 }} [[Float]],其中print $ map (flip (!!) 0) xs是数组,好像它是xs

更新

我认为使用fmap,[[Float]]中的(flip (!!) 0) <$> file是必要的,因为main的类型在那里,但事实证明file按预期工作;这使file !! 0修改为:

main

但是,现在我对main :: IO () main = fileData "file.txt" >>= \file -> print $ file !! 0 file的类型感到困惑。我认为它属于fileData "file.txt" >>= \file -> print $ file !! 0类型,因此应用IO [[Float]]不会直接起作用,因为(!!) monad。有没有更好的方法来考虑这个?

0 个答案:

没有答案