Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell GHC在编译时崩溃_Haskell_Ghc - Fatal编程技术网

Haskell GHC在编译时崩溃

Haskell GHC在编译时崩溃,haskell,ghc,Haskell,Ghc,怎么了?我认为这与一个已知的bug有关。参见ghc手册第14.2节: 我将在这里复制相关部分: GHC的内联可以通过数据类型编码递归的标准方式说服其不终止: 除了这个人为的程序之外,我们从来没有发现另一类程序会使GHC产生分歧,解决这个问题会给每个编译带来额外的开销。因此,这个错误仍然没有得到修复。这里面有更多的背景 换句话说,当您在负位置(即函数的参数)使用递归时,会出现此错误。从手册上看,他们似乎无意解决这个问题。正如前面提到的,当GHC的内联程序使用递归类型的参数时,问题就出现了。这可以

怎么了?

我认为这与一个已知的bug有关。参见ghc手册第14.2节:

我将在这里复制相关部分:

GHC的内联可以通过数据类型编码递归的标准方式说服其不终止:

除了这个人为的程序之外,我们从来没有发现另一类程序会使GHC产生分歧,解决这个问题会给每个编译带来额外的开销。因此,这个错误仍然没有得到修复。这里面有更多的背景


换句话说,当您在负位置(即函数的参数)使用递归时,会出现此错误。从手册上看,他们似乎无意解决这个问题。

正如前面提到的,当GHC的内联程序使用递归类型的参数时,问题就出现了。这可以通过
NOINLINE
pragma解决。就你而言:

data U = MkU (U -> Bool)

russel :: U -> Bool
russel u@(MkU p) = not $ p u

x :: Bool
x = russel (MkU russel)

{-#NOINLINE(我可以用Ubuntu(针对x86_64-unknown-linux的GHC 7.6.3版)重现这一点)。我想你没有理由不报告它。我会报告它,但因为这是你的错误,我将把积分留给你。然而,这可能只是增加
-fsimpl tick factor
的情况。如果用
打印“foo”替换main中的所有内容,错误仍然会发生
并删除
阶乘
。使用
-fsimpl tick factor=25000
(默认值的250倍!)错误仍然会发生。不仅如此,还会对我造成打击。看起来像是对某些构造的无限迭代展开。您从何处获得该代码(这是您自己的吗?)@UliKöhler这是我自己的代码,在GHCi中运行良好。这确实很奇怪。据我所知,GHC中的相关优化器代码与GHCi中的代码相同。您链接到了6.12手册;,尽管它所在的部分现在编号为14.2。(另外,)
ghc: panic! (the 'impossible' happened)
  (GHC version 7.6.3 for x86_64-apple-darwin):
    Simplifier ticks exhausted
    When trying UnfoldingDone a_sMx{v} [lid]
    To increase the limit, use -fsimpl-tick-factor=N (default 100)
    If you need to do this, let GHC HQ know, and what factor you needed
    To see detailed counts use -ddump-simpl-stats
    Total ticks: 7121

Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug
data U = MkU (U -> Bool)

russel :: U -> Bool
russel u@(MkU p) = not $ p u

x :: Bool
x = russel (MkU russel)
{-# NOINLINE (<|<) #-}