のようなポリモーフィックな「定数」は、5 :: Num a => a
実際には定数ではなく、辞書引数の関数です。したがって、定義すると
primes :: Num n => [n]
primes = ...
もちろん、悪い例です。多態性にする正当な理由はありません...私が本当に興味を持っているのは、たとえばmemo-trie
s を使用して、自明でない多態性関数をグローバルに記憶しようとする場合です。
このシーケンスは、異なるサイトからの呼び出し間で共有されず、パフォーマンスの点で良くありません。(これが、Haskell 標準が恐ろしい単型性制限を私たちにもたらした主な理由ではないでしょうか?)
共有を強制する方法を確認できる唯一の方法は、制約クラスのすべてのインスタンスにモノモーフィックな「タグ」を配置することです。例えば
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
…優雅さという点では良くありません。
このようなメモ化を実装するより良い方法はありますか?