小代码片段导致ghc无法终止

时间:2013-01-06 22:20:58

标签: haskell ghc

这个小haskell code snippet导致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而不是Vector时,代码工作正常。这是一个ghc问题还是图书馆问题?或者我的代码中某处有问题?

1 个答案:

答案 0 :(得分:5)

这似乎是一个GHC问题。

编译通过ghc-7.0.2使用vector-0.10.0.1和ghc-7.0.4使用vector-0.7.0.1进行,并使用ghc-7.2.1与vector-0.7.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。 / p>

编译在SpecConstr传递中挂起,vector包使非常大量使用。我打开ticket。好吧,someone was faster