我有一个以下格式的数据文件:每条线上用空格分隔的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。有没有更好的方法来考虑这个?