[Haskell-cafe] Re: performance question (John Meacham)

Stijn De Saeger stijndesaeger at gmail.com
Wed Jan 19 02:15:00 EST 2005


thanks Ben and John, 

your ideas looked like they may speed up things indeed, so i went
along with them and reimplemented the whole thing.... to my surprise,
the program got considerably slower even !

here is the new code.

> data ILtype = II | IE | EI | EE | NII | NIE | NEI | NEE deriving (Eq, Ord)

(... I found no increase in performance by using the UNPACK pragma as
you suggested, so I just ommitted it in this version...)

> data Interval = Range ILtype !Double !Double deriving (Eq, Ord)
> instance Show Interval where
>     show (Range iltype x y) = case iltype of 
>       II -> if x == y then (show x) 
>		 else "[" ++ (show x) ++ ".." ++ (show y) ++ "]"
>       IE -> "[" ++ (show x) ++ ".." ++ (show y) ++ ")"
>       EI -> "(" ++ (show x) ++ ".." ++ (show y) ++ "]"
>       EE -> "(" ++ (show x) ++ ".." ++ (show y) ++ ")" 
>       NII -> "Not " ++ show (Range II x y)
>       NIE -> "Not " ++ show (Range IE x y)
>       NEI -> "Not " ++ show (Range EI x y)
>       NEE -> "Not " ++ show (Range EE x y)

the flip of interval types:
> ilFlip :: ILtype -> ILtype
> ilFlip ilt = case ilt of 
>      II -> NII
>      IE -> NIE
>      EI -> NEI
>      EE -> NEE
>      NII -> II
>      NIE -> IE
>      NEI -> EI
>      NEE -> EE

The complement of Intervals :
> intComplement :: Interval -> Interval
> intComplement (Range iltype x y) = (Range (ilFlip iltype) x y)

membership function for Intervals:
> isIn :: Double -> Interval -> Bool
> isIn r (Range iltype x y) = case iltype of 
>       II -> r >= x && r <= y
>       IE -> r >= x && r < y
>       EI -> r > x && r <= y
>       EE -> r > x && r < y
>       NII -> r > y || r < x
>       NIE -> r > y || r <= x
>       NEI -> r >= y || r < x
>       NEE -> r >= y || r <= x

As always, any further comments or insights greatly appreciated.
stijn.


More information about the Haskell-Cafe mailing list