Существует ли автоматический способ запоминания глобальных полиморфных значений в Haskell?

Полиморфные "константы", вроде5 :: Num a => a, на самом деле не константы, а функции словарного аргумента. Следовательно, если вы определите

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

Плохой пример, конечно, здесь нет веских причин для того, чтобы он был полиморфным ... что меня действительно интересует, так это если вы пытаетесь глобально запоминать нетривиальную полиморфную функцию, напримерmemo-tries.
тогда эта последовательность не будет разделена между вызовами с разных сайтов, что не очень хорошо с точки зрения производительности. (Разве это не главная причина, по которой стандарт Хаскелла благословил нас Страшным ограничением мономорфизма?)

Единственный способ понять, как обеспечить совместное использование, - это иметь мономорфный «тег» для каждого экземпляра ограничивающего класса. Например.

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

... что нехорошо с точки зрения элегантности.

Есть ли более приятный способ реализовать такую ​​памятку?

Ответы на вопрос(3)

Ваш ответ на вопрос