Direct use of if-then-else with function type cause "Program error"

Mike Gunter m@ryangunter.com
Thu, 13 Mar 2003 23:06:48 -0800


With the following code

> run f = f 7 (-3)

> programError wd initVal = (if initVal < 0 then showAsUnsiged else const show) wd initVal
> noProblem wd initVal	  = f wd initVal  where f = if initVal < 0 then showAsUnsiged else const show

> showAsUnsiged width nIn	= show n  where n | nIn < 0	= 2^width + nIn
>                                                 | otherwise	= nIn

I get:

    $ hugs HugsIfFuncBug.lhs 
    __   __ __  __  ____   ___      _________________________________________
    ||   || ||  || ||  || ||__      Hugs 98: Based on the Haskell 98 standard
    ||___|| ||__|| ||__||  __||     Copyright (c) 1994-2002
    ||---||         ___||           World Wide Web: http://haskell.org/hugs
    ||   ||                         Report bugs to: hugs-bugs@haskell.org
    ||   || Version: November 2002  _________________________________________
    
    Haskell 98 mode: Restart with command line option -98 to enable extensions
    
    Reading file "/usr/lib/hugs/libraries/Hugs/Prelude.hs":
    Reading file "/usr/lib/hugs/libraries/Prelude.hs":
    Reading file "HugsIfFuncBug.lhs":
                       
    Hugs session for:
    /usr/lib/hugs/libraries/Hugs/Prelude.hs
    /usr/lib/hugs/libraries/Prelude.hs
    HugsIfFuncBug.lhs
    Type :? for help
    Main> run noProblem
    "125"
    Main> run programError
    "
    Program error: {instShow_v14_v1224 (showAsUnsiged instIntegral_v34 instOrd_v27 instNum_v30 (Num_fromInt (Real__sc0_Real (Integral__sc0_Integral instIntegral_v34)) 7))}
    
    Main> :q
    [Leaving Hugs]

Thanks.

        mike