gpt4 book ai didi

haskell - 为什么 gnuplot 图没有从 getContents 接收完整的标准输入?

转载 作者:行者123 更新时间:2023-12-02 14:55:27 24 4
gpt4 key购买 nike

我遇到了惰性 IO 问题,但我不知道如何解决它。
我这里有三个小测试程序,但 V2 是我真正想要的。
在某个地方,似乎 getContents 提前停止,或者 gnuplot 提前完成写入。

问题的关键是“我如何从 stdin 获取内容,并在此处使用 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:尝试绘制来自 stdin 的任何内容。它的运行方式与 V1 相同 - gnuplot 生成的临时文件被截断,所以我没有得到绘图。但是,如果我使用 1000 而不是 10k 运行,它确实可以工作 - 在编写 gnuplot csv 文件时它会在某个时刻被截断,所以我有一行看起来像 1767.0, 1767 的行。没有\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)])

最佳答案

这在很大程度上取决于竞争条件,你最终会得到什么,以及你是否得到一个情节。

函数plotPathStyle派生了一个新的Haskell线程,在该线程中调用gnuplot。该线程使用您传递的列表,因此如果通过惰性 IO 获取列表,则只有该线程才会真正读取该文件。函数 plotPathStyle 或多或少会立即返回,并且在主线程结束时,程序将关闭。

因此,根据调度的方式,您可能会看到截断的输出或根本看不到 gnuplot 窗口。 (如果我实际上编译程序而不是通过 runhaskell 调用,我通常不会得到任何图。)即使强制使用列表也无法使您摆脱这种情况。如果您想要非交互式使用(即不在 GHCi 内),似乎 gnuplot 包推荐使用 Graphics.Gnuplot.Advanced 中的接口(interface),它为您提供了更多功能控制和例如允许您明确等待情节完成。

关于haskell - 为什么 gnuplot 图没有从 getContents 接收完整的标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28852922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com