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

时间:2017-10-31 22:02:37

标签: haskell haskell-stack

我是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

干杯, 托本

2 个答案:

答案 0 :(得分:1)

或许可以尝试不那么长时间的输入?默认情况下,Ghci被解释,因此根据代码类型,您可以预测与编译相比可能出现大幅减速。需要6分钟的东西可能需要60分钟。

您可以使用-fobject-code来编译ghci编译模块。见https://downloads.haskell.org/~ghc/7.4.1/docs/html/users_guide/ghci-obj.html

编辑:我不知道为什么会被投票。有人是负面的南希。当然,这家伙应该有更多的细节和repro。但是,如果没有省略细节,这是可以回答的。

无论如何,我忘了提到另外一件事,即sum被打印的原因是由于懒惰。它可以在其余部分准备就绪之前获得输出的那部分。这可能是误解的根源。

答案 1 :(得分:0)

所以mgsloan是完全正确的。

问题在于所有关于shell的解释(它在大约1小时15分钟内运行),一旦我在stack ghci --ghci-options -fobject-code调用上添加了-fobject-code,我就把计算结果缩短到8分钟,接近于我作为编译程序运行时得到的6分钟。

Jupyter拒绝快速,所以我只会将其用于其他实验 - 没有关于如何调试它的线索,或者弄清楚为什么它几乎和编译程序一样快到非常慢。

额外信息:如果您有兴趣,我现在已经添加了一种方法,可以使用League.hs文件中的Data.Binary -look将计算结果写入磁盘。

这种方法允许我使用

将结果读入ghci中的变量
res <- TrueValue.League.loadResults "pl-201617.results"

结果大约是500MB,所以我第一次使用这个值需要大约22秒来计算任何东西。之后不到一秒钟,通常会少一点。

当我提出问题时,我很抱歉没有更清楚,但这真的是为什么我看到编译程序和ghci中运行之间的执行时间差别很大。 mgsloan非常友好地看透了这一点。