私は型クラスを持っています:
class Wrapper w where
open :: w -> Map String Int
close :: Map String Int -> w
あまり役に立たないように見えますが、意味的に異なる種類のsを (type
同義語だけでなく) 強く区別するために使用しています。Map String Int
newtype FlapMap = Flap (Map String Int)
newtype SnapMap = Snap (Map String Int)
...
クラスの任意のタイプで動作する関数がまだあります。
- この区別を行うためのより良い方法はありますか (おそらく
Wrapper
インスタンスのボイラープレートなしで)?
私はこれをしたい:
instance (Wrapper wrapper) => Show wrapper where
show w = show $ toList $ open w
多くのボイラープレートShow
インスタンスも記述する代わりに。
と を介しFlexibleInstances
てUndecidableInstances
、GHC は私のインスタンス宣言がすべてに適用されると考える点に私を導きShow
ますGHC.Show
。HaskellWiki と StackOverflow の回答者と HaskellWikiOverlappingInstances
は、完全に安全ではなく、混乱を招く可能性があると確信しています。GHCはそれを示唆していません。
なぜ GHC は最初に fx のどのインスタンス
Show Int
を選択すればよいかわからないことに文句を言い (それで、なぜコンパイル時に与えた制約を調べないのですか?)、次に、インスタンスがオーバーラップする可能性があると言われ、突然何をすべきかを知ってしまうのでしょうか?OverlappingInstances
で許可を避けることはできますnewtype
か?