Hacker News new | ask | show | jobs
by fix_error 4891 days ago
GHC is pretty good at specializing type-class-using functions for particular instances, e.g. if you have

  fac :: (Num a, Eq a) => a -> a
  fac 0 = 1
  fac n = n*fac (n-1)

  main = do
    x <- readLn :: IO Int
    print (fac x)
it will create a specialization (without any indirect calls)

  fac_Int :: Int -> Int
and call that (in fact, in this case fac_Int will even be implemented by a worker function of type Int# -> Int# (unboxed ints)).

If you don't want to rely on this automatic optimization, you can always add a pragma {-# SPECIALIZE fac :: Int -> Int #-}.

(I used a recursive example because a non-recursive function would usually simply be inlined, avoiding any indirect calls too, assuming the call site is monomorphic).