【发布时间】:2019-12-10 17:21:00
【问题描述】:
问题
假设我有一个看起来像这样的 ADT
sealed trait TT
case class A(...) extends TT
case class B(...) extends TT
case class C(...) extends TT
// ... lot of others
我有这个函数,它为TT 的子集返回 true。假设A 和C。
def shouldIPublish(tt: TT): Boolean = ???
约束
- 我们收到的值
tt来自SortedSet,我无法真正更改。以下是函数shouldIPublish的调用方式:tts.exists(shouldIPublish)(tts是SortedSet[TT])。它已被删除。 - 我希望我的代码是可测试的。我目前的解决方案是不可能的。 (见下文)
- 代码应该为每个
TT类型编译。如果tt的实际类型在一个子集中(即A或C),则返回true,否则返回false。
我不完美的解决方案
val shouldIPublishPF: PartialFunction[TT, Unit] = {
case _: A =>
case _: C =>
}
def shouldIPublish(tt: TT): Boolean = shouldIPublishPF.isDefinedAt(tt)
我在这里使用偏函数是因为实际问题要复杂一些。我使用orElse 将几个偏函数组合在一起。
这个解决方案很容易推理并且足够简单。但是,
- 这似乎不是很地道。我的意思是这个工具(部分函数)似乎不适合这项工作(测试类型是否包含在一组类型中)。
-
我无法获得为偏函数定义的每个值。在这种情况下,它将是
A和C。当向部分函数添加新类型时,我的单元测试应该会失败。
替代方案(我能想到的)
类集
也许是最简单的解决方案。我可以拥有Set 并使用.getClass 上课。不过看起来很丑。
Set(A.getClass, C.getClass)
无形联积
起初看起来很有希望。非常地道。
type ShoudIPublish = A :+: C :+: CNil
不幸的是,我看不到如何测试 ShoudIPublish 中的类型是否“包含”。而且我不知道我们是否可以收集所有类型的列表(这里是A和C)。
你有什么建议吗?
【问题讨论】:
标签: scala shapeless category-theory