- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
感谢 newtype
和 GeneralizedNewtypeDeriving
扩展,人们可以轻松定义不同的轻量级类型:
newtype PersonId = PersonId Int deriving (Eq, Ord, Show, NFData, ...)
newtype GroupId = GroupId Int deriving (Eq, Ord, Show, NFData, ...)
它允许类型系统确保 PersonId
不会在需要 GroupId
的情况下意外使用,但仍然从 Int 继承选定的类型类实例
.
现在可以简单地将 PersonIdSet
和 GroupIdSet
定义为
import Data.Set (Set)
import qualified Data.Set as Set
type PersonIdSet = Set PersonId
type GroupIdSet = Set GroupId
noGroups :: GroupIdSet
noGroups = Set.empty
-- should not type-check
foo = PersonId 123 `Set.member` noGroups
-- should type-check
bar = GroupId 123 `Set.member` noGroups
这是类型安全的,因为映射是由键类型参数化的,而且 Set.member
操作是多态的,所以我不需要定义每个 id 类型的变体,例如作为 personIdSetMember
和 groupIdSetMember
(以及我可能想要使用的所有其他设置操作)
...但是我如何以与示例类似的方式分别使用更高效的 IntSet
来代替 PersonIdSet
和 GroupIdSet
多于?有没有一种简单的方法,无需将整个 Data.IntSet API 包装/复制为类型类?
最佳答案
我认为你必须按照你所说的包装IntSet
。但是,您可以引入幻像类型来创建一系列彼此兼容的 ID
和 IDSet
:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import qualified Data.IntSet as IntSet
import Data.IntSet (IntSet)
newtype ID a = ID { unID :: Int }
deriving ( Eq, Ord, Show, Num )
newtype IDSet a = IDSet { unIDSet :: IntSet }
deriving ( Eq, Ord, Show )
null :: IDSet a -> Bool
null = IntSet.null . unIDSet
member :: ID a -> IDSet a -> Bool
member i = IntSet.member (unID i) . unIDSet
empty :: IDSet a
empty = IDSet $ IntSet.empty
singleton :: ID a -> IDSet a
singleton = IDSet . IntSet.singleton . unID
insert :: ID a -> IDSet a -> IDSet a
insert i = IDSet . IntSet.insert (unID i) . unIDSet
delete :: ID a -> IDSet a -> IDSet a
delete i = IDSet . IntSet.delete (unID i) . unIDSet
因此,假设您有一个 Person
类型和一个 Group
类型,您可以执行以下操作:
type PersonID = ID Person
type PersonIDSet = IDSet Person
type GroupID = ID Group
type GroupIDSet = IDSet Group
关于haskell - 如何 "newtype"IntSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5746590/
对我来说,整数集似乎是一种可折叠的数据结构。 为什么是 Data.IntSet不是 Foldable 的实例? 我的实际意图是使用 find在 IntSet . 如何实现 Data.IntSet 的查
感谢 newtype 和 GeneralizedNewtypeDeriving 扩展,人们可以轻松定义不同的轻量级类型: newtype PersonId = PersonId Int derivin
我设计了使用 ArrayList 的新 IntSet 类。首先,我通过 ArrayList 扩展 Intset 并开始实现方法。我在 union() 方法中遇到了一些问题。这是我的代码... publ
来 self 的问题 Insert element to ArrayList with ascending order and no duplicate elements 我已经完成了插入方法。 现在
根据 Redis's memory optimization page可以设置可配置的 set-max-intset-entries 以优化大型整数集的内存。我用小于 2M 的整数做了一些测试,将 s
我是一名优秀的程序员,十分优秀!