varsayalım böyle bir veri tipi vardır:Şartlı tür kurucusu üzerinde varoluşsal türü için parametreli göster türetmek
{-# LANGUAGE RankNTypes #-}
data X a = forall b. Show b => X (a b)
Ben Show (X a)
türetmek istiyorum, ama tabii bu yüzden bir örneği varsa bunu yalnızca yapabilirsiniz Show (a b)
. Ben
{-# LANGUAGE StandaloneDeriving #-}
deriving instance Show (a b) => Show (X a)
yazmak için cazip ama o forall bağlı olduğundan maalesef tipi değişken b
örnek bağlamında kullanılamaz.
Benim sonraki girişimi şöyle, veri tipi tanımı forall içine Show (a b)
bağlamı taşımak oldu:
data X a = forall b. Show (a b) => X (a b)
deriving instance Show (X a)
Bu derler, ama ne yazık ki şimdi bir bir X
inşa yeteneğini kaybetmiş göze çarpmayan (a b)
.
X
herhangi (a b)
inşa ve daha sonra şartlı (a b)
showable olup Show (X a)
yalnızca türetmek izin vermek için herhangi bir yolu var mı?
Çok kötü. GHC kılavuzunun OverlappingInstances hakkında söylediği her şey korkutucu. – Will
Evet, bu kesinlikle tavsiye edilmez. Show1, diğer örnekleri kolayca kolayca gizleyebilir. –