3
the GHC manual section on type familiesのように、カスタムインスタンスを提供することで効率的に特殊化できる「汎用」マップデータ構造が必要です。関連するデータファミリとオーバーラップするインスタンス
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module MapKey where
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
class MapKey k where
data MMap k :: * -> *
instance {-# OVERLAPPING #-} MapKey() where
newtype MMap() v = UnitMap (Maybe v)
instance {-# OVERLAPPABLE #-} Ord k => MapKey k where
newtype MMap k v = OrdMap (Map k v)
悲しいことに、これはうまくいきません。 GHC(8.2.1)は文句を言う:
Conflicting family instance declarations:
MMap() = UnitMap (Maybe v)
MMap = OrdMap (Map k v)
|
14 | newtype MMap() v = UnitMap (Maybe v)
|
これにはいくつかの言語拡張機能がありますか? それ以外の場合、ユーザーがOrd
の「デフォルト」インスタンスを簡単に定義できるようにする別の方法はありますか?
データファミリは重複していない必要があります。タイプの安全性はもはや保持されなくなりました...興味深い考えです。 – Alec
なぜそうですか?重複するメソッドだけがまだ安全である場合、関連するタイプとの重複が危険な状況がありますか? I.o.w.オーバーラップするタイプのクラスは、オーバーラップするタイプのクラスよりも「より安全ではない」場合 –
関連する_type_ファミリが重複していて、_data_ファミリだけではありません。多型は重複するデータファミリで分解されます。 [ここにスケッチがあります](https://gist.github.com/harpocrates/8e9c5d693f312e39fff4c7ae1df09f41) – Alec