Gibt es eine automatische Möglichkeit, globale polymorphe Werte in Haskell zu speichern?

Polymorphe "Konstanten", wie5 :: Num a => asind nicht wirklich Konstanten, sondern Funktionen eines Dictionary-Arguments. Daher, wenn Sie definieren

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

Schlechtes Beispiel, es gibt natürlich keinen guten Grund, es polymorph zu machen. Ich bin wirklich daran interessiert, wenn Sie versuchen, eine nichttriviale polymorphe Funktion global einzuprägen, z.memo-tries.
dann wird diese Sequenz nicht zwischen Anrufen von verschiedenen Standorten geteilt, was in Bezug auf die Leistung nicht gut ist. (Ist dies nicht der Hauptgrund, warum der Haskell-Standard uns mit der Einschränkung des gefürchteten Monomorphismus gesegnet hat?)

Die einzige Möglichkeit, die Freigabe zu erzwingen, besteht darin, ein monomorphes "Tag" für jede Instanz der einschränkenden Klasse zu haben. Z.B.

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

... was in Sachen Eleganz nicht schön ist.

Gibt es eine schönere Möglichkeit, eine solche Memoisierung zu implementieren?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage