如何存储 Either (Key a) (Key b)?

How do I store Either (Key a) (Key b)?

我有以下型号:

User
  ...
Group
  ...
Sharing
  objectId (Either UserId GroupId)

Sharing 实体中,我想存储 UserIdGroupId 并区分它们。简单地使用 Either 不起作用:

  • Not in scope: type constructor or class `UserId'
  • Not in scope: type constructor or class `GroupId'

添加新的求和类型也不起作用:

data SharingIdType = SharingUserId UserId | SharingGroupId GroupId
  • Not in scope: type constructor or class `SharingIdType'

无法将 SharingIdType 移动到另一个模块中,因为它使用 UserIdGroupId 类型。我看到的唯一方法是为每种共享类型创建一个实体,例如 UserSharing/GroupSharing.

除此之外,如何解决这个问题?

经过一段时间的搜索和思考,我总结出两种可能的解决方案:

1.

如果 SharingIdTypes 的数量是静态的或很少改变(意味着,可以重新编译源代码来改变它或改变数据库模式),处理问题的正确方法是必须每种共享类型的实体:

User
  ...
Group
  ...
UserSharing
  userId UserId
GroupSharing
  groupId GroupId

这里问题的"sumness"被移到了数据库查询。每当我需要找出共享的内容时,我都会创建两个 selectList 并查询两个 table 而不是一个。

2.

如果 SharingIdTypes 的数量需要动态更改,则需要 SharingType 实体:

User
  ...
Group
  ...
SharingType
  description String
Sharing
  objectId SharingTypeId

此 table 填充了对应于 SharingIdTypes 构造函数的值:

do
  insert $ SharingType "user"
  insert $ SharingType "group"

现在每当我们分享东西时,我们都会参考 SharingTypeId