Skip to content

Simplifier ticks exhausted: a 10-line case

I was trying to define a function that could take itself as an argument.

newtype MobiusFn a = MobiusFn {
    func :: MobiusFn a -> a
}

spin :: MobiusFn a -> a
spin mf = func mf mf

Use it to find suffixes of a String

suffixes :: String -> [String]
suffixes = spin $ MobiusFn suffixesMF
    where suffixesMF _ [] = []
          suffixesMF mf s@(_:xs) = s : spin mf xs

Add main and compile

main = readLn >>= (print . suffixes)

The compiler panicked with

[1 of 1] Compiling Main             ( test.hs, test.o )
ghc: panic! (the 'impossible' happened)
  (GHC version 8.0.1 for i386-unknown-linux):
        Simplifier ticks exhausted
  When trying UnfoldingDone mf_s1UD

But if we ignore the empty string case, it works well with non-empty strings.

suffixes :: String -> [String]
suffixes = spin $ MobiusFn suffixesMF
    where suffixesMF _ s@[_] = [s]
          suffixesMF mf s@(_:xs) = s : spin mf xs

Two versions tested.

GHC version 8.0.1 for i386-unknown-linux
GHC version 7.10.3 for i386-unknown-linux

Thank you for reading.

Trac metadata
Trac field Value
Version 8.0.1
Type Bug
TypeOfFailure OtherFailure
Priority high
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information