gpt4 book ai didi

haskell - 数据系列默认实例

转载 作者:行者123 更新时间:2023-12-03 07:10:29 25 4
gpt4 key购买 nike

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

最佳答案

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

关于haskell - 数据系列默认实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18965939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com