2013-01-06 28 views
9

这个小haskell code snippet导致GHC编译期间不会终止:一小段代码将导致GHC不终止

{-# LANGUAGE BangPatterns #-} 
{-# OPTIONS_GHC -O2 #-} 

import qualified Data.Vector.Unboxed.Mutable as MV 
import Data.Vector.Unboxed ((!)) 
import qualified Data.Vector.Unboxed as V 
import Control.Monad (forM_) 

similar :: V.Vector Char -> Int 
similar v = l + sum (map (similar' 1 1) checks) 
    where 
    (l,checks) = let h = V.head v in V.foldl' 
     (\(i,is) c -> if c == h then (i+1,i:is) else (i+1,is)) (1,[]) (V.tail v) 
    similar' !r !n !i = if i < l-1 && v!(n) == v!(i+1) then similar' (r+1) (n+1) (i+1) 
     else r 

main :: IO() 
main = do 
    n <- getLine 
    v <- MV.replicate (read n) 0 
    forM_ [1..read n] $ \n' -> do 
     v' <- getLine 
     MV.unsafeWrite v (n'-1) (similar . V.fromList $ v') 
    V.unsafeFreeze v >>= V.mapM_ print 

我试图GHC 7.4.1和7.6.1两者不会终止。当我使用ByteString s而不是Vector s时,代码工作正常。这是ghc问题还是图书馆问题?或者在我的代码中有什么问题?

+2

如果编译器崩溃,这是编译器的错误。 – 2013-01-06 22:59:46

回答

5

这似乎是一个GHC问题。

汇编通过ghc-7.0.2使用vector-0.10.0.1和ghc-7.0.4使用vector-0.7.0.1,并且使用vector-0.7.1挂载ghc-7.2.1,ghc- 7.2.2与载体-0.9,ghc-7.4.1与载体-0.9.1,ghc-7.4.2与载体-0.9.1和ghc-7.6.1与载体-0.9.1和载体-0.10.0.1。

汇编挂在SpecConstr通过,其中vector包使非常大量使用。我打算打开ticket。那么,someone was faster