【发布时间】:2014-05-04 21:44:32
【问题描述】:
请考虑以下代码,该代码取自我为帮助我学习 Haskell 而构建的一个工作示例。这段代码将从雅虎下载的包含股票报价的 CSV 文件解析为一个漂亮的简单柱状列表,然后我可以使用这些柱状列表。
我的问题:如何编写一个函数,将文件名作为参数并返回一个 OHLCBarList,以便可以正确封装 main 中的前四行?
换句话说,我如何实现(不会出现关于 IO 的各种错误)类型为的函数
getBarsFromFile :: Filename -> OHLCBarList
这样在 main 的前四行中完成的繁重工作可以正确封装?
我自己尝试过这样做,但由于我对 Haskell 的了解有限,我失败了。
import qualified Data.ByteString as BS
type Filename = String
getContentsOfFile :: Filename -> IO BS.ByteString
barParser :: Parser Bar
barParser = do
time <- timeParser
char ','
open <- double
char ','
high <- double
char ','
low <- double
char ','
close <- double
char ','
volume <- decimal
char ','
return $ Bar Bar1Day time open high low close volume
type OHLCBar = (UTCTime, Double, Double, Double, Double)
type OHLCBarList = [OHLCBar]
barsToBarList :: [Either String Bar] -> OHLCBarList
main :: IO ()
main = do
contents :: C.ByteString <- getContentsOfFile "PriceData/Daily/yhoo1.csv" --PriceData/Daily/Yhoo.csv"
let lineList :: [C.ByteString] = C.lines contents -- Break the contents into a list of lines
let bars :: [Either String Bar] = map (parseOnly barParser) lineList -- Using the attoparsec
let ohlcBarList :: OHLCBarList = barsToBarList bars -- Now I have a nice simple list of tuples with which to work
--- Now I can do simple operations like
print $ ohlcBarList !! 0
【问题讨论】:
-
类型必须是
Filename -> IO OHLCBarList。能否请您正确格式化代码并删除多余的屏幕截图?
标签: haskell