我遇到了惰性 IO 的问题,但我不知道如何解决它。
我在这里有三个小型测试程序,但 V2 是我真正想要的东西。
在某个地方,似乎 getContents 提前停止了,或者 gnuplot 提前完成了编写。
问题的关键是'我如何从标准输入中获取东西,并在此处使用 gnuplot 进行绘制',但我也想知道如何调试潜在问题。
版本 1,不处理 gnuplot。运行,按预期paste <(seq 10000) <(seq 10000) | runhaskell /tmp/hasktest2.hs
打印。(10000.0,10000.0)
显然所有标准输入都已加载。
import Data.List
main = do
contents <- getContents
print . last . map f . lines $ contents
f :: String -> (Double, Double)
f s = (read x, read y)
where
[x,y] = words s
V2:尝试绘制来自标准输入的任何内容。这与 V1 的运行方式相同 - gnuplot 生成的临时文件被截断,所以我没有得到绘图。但是,如果我使用 1000 而不是 10k 运行,它确实可以工作 - 在编写 gnuplot csv 文件时它会在某些时候被截断,所以我有一条看起来像1767.0, 1767
no的行\n
。
main = do
contents <- getContents
plotPathStyle [] (PlotStyle Points (DefaultStyle (1))) . map f . lines $ contents
f :: String -> (Double, Double)
f s = (read x, read y)
where
[x,y] = words s
V3:只是为了测试 gnuplot 是否可以实际处理 10k 点,并将它们写入文件 - 这会产生一个情节,正如预期的那样。
import Graphics.Gnuplot.Simple
main = plotPathStyle [] (PlotStyle Points (DefaultStyle (1))) (zip [1..10000] [1..10000] :: [(Double, Double)])