У меня есть функция класса Haskell, которая выглядит следующим образом:
class Foo m where
foo :: Num a => m a -> a
Я хочу сгенерировать две специализации foo
, одну в любое время, когда m ~ X Int
, а другая - m ~ X Int, a ~ Int
. Я написал для этого следующий код:
instance Foo (X a) where
{-# SPECIALIZE instance Foo (X Int) #-}
foo = ...
{-# SPECIALIZE foo :: X Int Int -> Int #-}
Из того, что я могу сказать, в файле, который содержит этот код, я получаю обе специализации. Однако в модуле, использующем foo
, он всегда указывает на менее общую специализацию, т.е. foo :: Num a => X Int a -> a
, даже когда a ~ Int
.
Есть ли способ сказать GHC предпочесть наиболее специализированную версию foo
, а не частично специализированную версию?
Спасибо.