我想使用数据族为某些数据类型创建有效的集合表示。对于所有其他(Ord)数据类型,我想使用 Data.Set 作为实例。问题是,在这种情况下,我不想用我想使用的每种类型显式实例化数据类型类。相反,我想要一个涵盖其余类型的通用实例。
例子:
{-# LANGUAGE TypeFamilies #-}
module Test where
import qualified Data.Set as D
class SetKey a where
data Set a :: *
empty :: Set a
insert :: a -> Set a -> Set a
member :: a -> Set a -> Bool
toList :: Set a -> [a]
instance SetKey Bool where
data Set Bool = BoolSet Bool Bool
empty = BoolSet False False
insert x (BoolSet t f) = case x of
True -> BoolSet True f
False -> BoolSet t True
member x (BoolSet t f) = case x of
True -> t
False -> f
toList (BoolSet t f) = if t && f
then [True, False]
else if t
then [True]
else if f
then [False]
else []
我知道如果没有 UndecidableInstances,以下内容将不起作用。即使这样,这也会导致与 SetKey 的 Bool 实例发生冲突(Bool 是 Ord 的实例)
instance (Ord a) => SetKey a where
newtype Set a = Wrap { unWrap :: D.Set a }
empty = Wrap . D.empty
insert x = Wrap . D.insert x . unWrap
member x = Wrap . D.member . unWrap
toList = D.toList . unWrap
我将如何解决此类问题?我尝试将默认值直接放入数据族类定义中,但要么我无法弄清楚语法,要么功能根本不存在:
class SetKey a where
data Set a :: *
data Set a = D.Set a
empty :: Set a
empty = D.empty
insert :: a -> Set a -> Set a
insert = D.insert
member :: a -> Set a -> Bool
member = D.member
toList :: Set a -> [a]
toList = D.toList
如果代码永远无法工作,我能做些什么呢?如果 Data.Set 没有 Ord 要求,这样的代码可以工作吗?