Существует ли автоматический способ запоминания глобальных полиморфных значений в Haskell?
Полиморфные "константы", вроде5 :: Num a => a
, на самом деле не константы, а функции словарного аргумента. Следовательно, если вы определите
primes :: Num n => [n]
primes = ...
Плохой пример, конечно, здесь нет веских причин для того, чтобы он был полиморфным ... что меня действительно интересует, так это если вы пытаетесь глобально запоминать нетривиальную полиморфную функцию, напримерmemo-trie
s.
тогда эта последовательность не будет разделена между вызовами с разных сайтов, что не очень хорошо с точки зрения производительности. (Разве это не главная причина, по которой стандарт Хаскелла благословил нас Страшным ограничением мономорфизма?)
Единственный способ понять, как обеспечить совместное использование, - это иметь мономорфный «тег» для каждого экземпляра ограничивающего класса. Например.
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
... что нехорошо с точки зрения элегантности.
Есть ли более приятный способ реализовать такую памятку?