Skip to content

Ineffective seq/BangPatterns

This could be related to #5557 (closed), but it might be something else.

  1. 2.1 was very picky about where you placed your bangs/seqs, for example
{-# LANGUAGE BangPatterns #-}
module Main (main) where

main :: IO ()
main = print (f 1000000)

f :: Integer -> Integer
f n = go n 0
  where
    go 0 !sm = sm
    go k acc = go (k-1) (acc+k)

OR

module Main (main) where

main :: IO ()
main = print (f 1000000)

f :: Integer -> Integer
f n = go n 0
  where
    go a b | a `seq` b `seq` False = undefined
    go k acc
        | k == 0    = acc
        | otherwise = go (k-1) (acc+k)

gave a stack overflow when compiled with ghc -O2. You have to place the bang/seq on the second equation for it to work. Older ghc versions treated it well, as does HEAD, so it seems fixed, but perhaps a regression test is in order?

Trac metadata
Trac field Value
Version 7.2.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
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