¿Existe una forma automática de memorizar valores polimórficos globales en Haskell?

"Constantes" polimórficas, como5 :: Num a => a, no son realmente constantes sino funciones de un argumento de diccionario. Por lo tanto, si define

primes :: Num n => [n]
primes = ...

Mal ejemplo, por supuesto, no hay una buena razón aquí para tenerlo polimórfico ... lo que realmente me interesa es si intentas memorizar globalmente una función polimórfica no trivial, con p.memo-tries.
entonces esta secuencia no se compartirá entre llamadas de diferentes sitios, lo que no es bueno en términos de rendimiento. (¿No es esta la razón principal por la cual el estándar de Haskell nos bendijo con la Restricción temida del monomorfismo?)

La única forma en que puedo ver cómo forzar el intercambio es tener una "etiqueta" monomórfica alrededor de cada instancia de la clase restrictiva. P.ej.

erastothenes :: Num n => [n]
erastothenes = ...

class (Num n) => HasPrimes n where
  -- | @'primes' ≡ 'erastothenes'@
  primes :: [n]

integerPrimes :: [Integer]
integerPrimes = erastothenes

instance HasPrimes Integer where
  primes = integerPrimes

... que no es agradable en términos de elegancia.

¿Hay alguna manera mejor de implementar tal memorización?

Respuestas a la pregunta(3)

Su respuesta a la pregunta