
Hello all! Currently this is more of a curiosity for me rather than a real obstacle to learn Haskell, but I'd appreciate any insight into this behaviour nevertheless. Given the (dumb, I know, but it's for illustration purpose) program: --- import Data.Char type Position = (Char, Integer) sameSquare :: Position -> Position -> Bool sameSquare p1 p2 = ssqHelper p1 p2 ssqHelper :: Position -> Position -> Bool ssqHelper (r1, c1) (r2, c2) | (((c1-1) `div` 3) == ((c2-1) `div` 3) && ((((ord r1) - 65) `div` 3) == (((ord r2) - 65) `div` 3))) = True | otherwise = False main :: IO () main = print (sameSquare ('A', 2) ('B', 2)) --- If I compile this with profiling info and run the profiler all seems well (independently of optimization settings). Now, if I comment the line --ssqHelper :: Position -> Position -> Bool and do the same (compile with profiling info) I can see rather surprising results. While I'd expect exactly one call to ssqHelper for every call to sameSquare this is actually only the case if compiled without optimizations. Using -O2 when compiling I get a full 5 calls of ssqHelper for every call to sameSquare. I am unable to imagine an optimization that would be more efficient with five calls instead of one. And I do not understand either what this has to do with the type annotation. Within such a trivial program the inferred type should be equivalent, shouldn't it? Actually ghci generalizes slightly: Integral instead of Integer. But that's no clue for me either... BTW I'm using ghc 6.10.4. (In case it matters.) Any hint would be appreciated. Thanks, Thomas