可执行文件完成,但 ghci 只打印一个"



我是Haskell的新手,在代码评估方面有一些问题。

当我写这篇文章时:

main :: IO ()
main = print $ "v1: " ++ show v1 ++ " v2: " ++ show v2
where
v1 = Goal.value (0,0) Goal.Home 39
v2 = Goal.value (2,1) Goal.Away 50

然后在终端中运行该程序,它在大约6分钟内完成。

但当我执行stack ghcistack exec jupyter -- notebook时,代码在执行时会挂起

Goal.value (0,0) Goal.Home 39

在ghci中,它写了一个"然后什么都没有。

它曾经工作过,自从我让它工作以来,我只研究了TrueValue.MatchReader中的解析器是如何工作的。

为什么我看到这种差异?在这一点上我相当困惑。

我真的很怀念有这样一个交互环境来处理我的数据。特别是因为计算需要6分钟,所以我想在League.results上开发和测试我的函数,而不必为每一轮等待太久。

我的所有代码都在https://github.com/lehoff/tvhs

干杯,Torben

也许可以在不需要那么长时间的输入上尝试一下?默认情况下,Ghci是被解释的,因此根据代码的类型,与编译相比,你可以预测可能会出现的大规模放缓。一件需要6分钟的事情可能需要60分钟。

相反,您可以使用-fobject代码让ghci编译模块。看见https://downloads.haskell.org/~ghc/7.4.1/docs/html/users_guide/ghci-obj.html

编辑:我不知道为什么这个被否决了。有人是个消极的南希。当然,这家伙应该有更多的细节和指责。但如果没有遗漏的细节,这是可以回答的。

无论如何,我忘了提另一件事,那就是"被打印的原因是懒惰。它可以在剩下的部分准备好之前获得这部分输出。这可能是这里误解的根源。

所以mgsloan是完全正确的。

这个问题完全是关于正在解释的shell(它在大约1小时15分钟内运行),当我在stack ghci --ghci-options -fobject-code调用上添加-fobject代码时,我的计算时间减少到了8分钟,这与我作为编译程序运行时的6分钟非常接近。

Jupyter拒绝快速,所以我只会把它用于其他实验——不知道如何调试它,也不知道它是如何从几乎和编译程序一样快变成非常慢的。

额外信息:我现在添加了一种使用Data将计算结果写入磁盘的方法。二进制-如果您感兴趣,请查看League.hs文件。

这种方法允许我使用将结果读取到ghci中的变量中

res <- TrueValue.League.loadResults "pl-201617.results"

结果大约是500MB,所以我第一次使用这个值时,计算任何东西都需要大约22秒。在那之后,它只需要不到一秒钟的时间,通常要少得多。

我想为我在陈述问题时没有说得更清楚而道歉,但这实际上是关于为什么我看到编译后的程序和在ghci中运行之间的执行时间有巨大差异。mgsloan看到这一点真是太好了。

最新更新