2013-01-06 4 views
9

Ten niewielki haskell code snippet powoduje GHC aby nie zakończyć podczas kompilacji:Mały fragment kodu powoduje ghc nie do wypowiedzenia

{-# 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 

Próbowałem GHC 7.4.1 i 7.6.1 i oba nie kończą. Kod zadziałał prawidłowo, gdy użyłem ByteString s zamiast Vector s. Czy jest to problem ghc lub biblioteka? czy jest jakiś problem w moim kodzie?

+2

Jeśli kompilator ulegnie awarii, jest to wina kompilatora. –

Odpowiedz

5

Wydaje się, że jest to problem z GHC.

Kompilacja przechodzi z ghc-7.0.2 przy użyciu wektora-0.10.0.1 i ghc-7.0.4 przy użyciu wektora-0.7.0.1 i zawiesza się z ghc-7.2.1 z wektorem-0.7.1, ghc- 7.2.2 z wektorem-0.9, ghc-7.4.1 z wektorem-0.9.1, ghc-7.4.2 z wektorem-0.9.1 i ghc-7.6.1 z wektorem-0.9.1 i wektorem-0.10.0.1.

Kompilacja zawiesza się w przepustce SpecConstr, której intensywne korzystanie z pakietu powoduje duże obciążenie. Mam zamiar otworzyć ticket. Cóż, someone was faster.

Powiązane problemy