型を使用してインスタンスを明確にするコードがいくつかあり(実際のコードは型タグにGHC.TypeLitsシングルトンを使用していますが、それは密接な関係はないと思います)、テキストレベルの重複を避けるためにletバインディングを使用したいと思います; 残念ながら、これは結果を単形化します。
以下は問題の例です。
class Foo a where
foo :: a
instance Foo Int where
foo = 0
instance Foo Char where
foo = 'a'
data Bar a = Bar String
deriving (Show)
bar :: forall a. (Show a, Foo a) => a -> Bar a
bar _ = Bar $ show (foo :: a)
idInt :: Bar Int -> Bar Int
idInt = id
idChar :: Bar Char -> Bar Char
idChar = id
main = let quux = bar undefined in
print (idInt quux) >> print (idChar quux)
上記のコードはコンパイルされません(ただし、もちろん、多形であるように注釈を入力すると、すべてが正常に機能します)、と一致しquux
なかったと正しく文句を言います。タイプアノテーションを付けずに、また各使用サイトで繰り返すことなく、コンパイルを成功させる方法はありますか?Int
Char
bar undefined