Полиморфные "константы", такие как 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
... что не приятно с точки зрения элегантности.
Есть ли лучший способ реализовать такую memoisation?