【发布时间】:2012-07-04 00:58:18
【问题描述】:
所以我的 haskell 程序看起来像这样:
main = do
secondData <- loadSecondBars "output.data"
putStrLn $ "Generated Second Data " ++ (show $ length secondData)
let tenMinBars = secondData `seq` generateBars (barSize featureSet) secondData
putStrLn $ "Generated Ten Minute Bars " ++ (show $ length tenMinBars)
let combinedData = seq tenMinBars sortBars (tenMinBars ++ secondData)
putStrLn $ "Generated Combined" ++ (show $ length combinedData)
let completedOrderManager = evalState (runBar combinedData) startState
putStrLn "Ran Algo"
这样做需要大约 8 秒来加载我的第二个数据,然后大约 3 秒来完成其余的功能。
但是,如果我删除显示长度数据,它会闪烁
"Generated Second Data"
"Generated Ten Minute Bars"
"Generated Combined"
"Ran Algo"
然后暂停一下,直到它运行完所有实际功能。
我的理解是,在其中包含 seq 可以防止惰性评估。我用错了吗?
【问题讨论】:
-
是的,seq 将在返回第二个参数之前评估第一个参数。如我所见,这里的问题是 let tenMinBars = ... 等不会评估 seq 自身,因此 seq 的第一个参数仅在评估 let 表达式时才被评估。不过,据我所知!我还是个 Haskell 新手!
-
@cool_me5000 - 这可能是问题的一部分,但我认为这里没有足够的代码可以确定。这取决于
runBar以及completeOrderManager会发生什么。
标签: haskell