Мне нужна «общая» структура данных карты, которую можно было бы эффективно специализировать, предоставляя пользовательские экземпляры, как в раздел руководства GHC по семействам типов.
{-# 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
?