
ben.franksen:
Mitar wrote:
On Fri, Jul 18, 2008 at 3:54 PM, Chaddaï Fouché
wrote: So that I can easily change the type everywhere. But it would be much nicer to write:
data Quaternion a = Q !a !a !a !a deriving (Eq,Show)
Only the performance of Num instance functions of Quaternion is then quite worse.
You can probably use a specialization pragma to get around that.
But why is this not automatic? If I use Quaternions of only one type in the whole program then why it does not make specialized version for it? At least with -O2 switch.
You could try jhc: it does whole program optimization. Ghc compiles each module separately.
No need to switch compilers. GHC is able to do a pretty good job. Consider, data Q a = Q !a !a !a !a deriving (Eq,Show) -- yeah, polymorphic go :: Num a => Q a -> Q a go (Q 0 0 0 0) = Q 1 2 3 4 go (Q a b c d) = go $! Q (a * a) (b * b) (c * c) (d * d) -- ah, but we fix it. type QI = Q Int -- and try that: main = print (go (Q 2 3 7 13 :: QI)) GHC specialises and gives us, $wgo :: Int# -> Int# -> Int# -> Int# -> Q Int So just use ghc-core to check what you're getting. -- Don