4

我想使用数据族为某些数据类型创建有效的集合表示。对于所有其他(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 要求,这样的代码可以工作吗?

4

1 回答 1

5

默认数据族没有意义,因为你必须声明数据类型的构造函数,并且你不能有不同类型的同名构造函数。您不能像在上一个示例中那样使用数据族作为类型族。

于 2013-09-23T18:28:10.500 回答