O pequeno snippet de código faz com que o ghc não termine

9

Este pequeno snippet de código haskell faz com que o ghc não termine durante a compilação:

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

Eu tentei ghc 7.4.1 e 7.6.1 e ambos não terminam. O código funcionou bem quando usei ByteString s em vez de Vector s. Isso é um problema ghc ou um problema de biblioteca? ou há algum problema em algum lugar no meu código?

    
por haskelline 06.01.2013 в 23:20
fonte

1 resposta

5

Parece ser uma questão de GHC.

A compilação passa com ghc-7.0.2 usando vetor-0.10.0.1 e ghc-7.0.4 usando vetor-0.7.0.1, e trava com ghc-7.2.1 com vetor-0.7.1, ghc-7.2 .2 com vetor-0.9, ghc-7.4.1 com vetor-0.9.1, ghc-7.4.2 com vetor-0.9.1 e ghc-7.6.1 com vetor-0.9.1 e vetor-0.10.0.1. / p>

A compilação trava no SpecConstr pass, que o pacote vector faz muito uso pesado de. Vou abrir um tíquete . Bem, alguém foi mais rápido .

    
por Daniel Fischer 07.01.2013 / 00:00
fonte