建模两种类型之间的二元关系

 开心123 发布于 2023-02-12 12:26

有企业和人.用户可以喜欢或发布关于商家的评论,但对于一个人来说也不会发生同样的事情.当用户发布有关某个商家或喜欢它的内容时,该商家称之为target喜欢或发布:

trait TargetingRelation[TargetingType[_],TargetedType]

class Business

class Person

class Post[Target | TargetingRelation[Business,Post] ] {
  def target:Target
}

class Like[Target | TargetingRelation[Business,Like] ] {
  def target:Target
}

在这里,我发明了一种T | P[T]符号意义类型参数T,使其满足某些属性P[T](或者T :|: P[T]如果它具有更多的类型吸引力).代码中的其他地方我想要声明如下:

object canPostAboutBusiness extends TargetingRelation[Post,Business] 
object canLikeBusiness      extends TargetingRelation[Like,Business]

这些对象实际上是证据,类似于Haskell类型类.所以这会打字检查:

val p = new Post[Business]
val l = new Like[Business]

不是这个:

val p = new Post[Person]
val l = new Like[Person]

就我对Scala的认识而言,我无法以令人满意的方式对这种特殊情况进行建模.现在我坚持认为这不是子类型,因为商业不是:

class Business extends 
  TargetingRelation[Post,Business] with 
  TargetingRelation[Like,Business]

事实上,非常希望Business仍然完全不知道Post.的关系实际上是两外PostBusiness.此外,我认为上面的代码甚至不会编译开始,因为Business它继承了TargetingRelation两次.很受欢迎.

related:使用类类型参数中的上下文绑定

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有