scala - 如何从 TypeClass 解析中排除特定类型?

标签 scala typeclass type-constraints

我想为大多数类型提供一个 ToCondition 操作,但不为字符串提供。 (这是在移植 Javascript 代码时,经常进行非空和非零测试,重写所有此类测试以进行适当比较非常乏味)。这样做很容易,因此我会在运行时收到错误消息:

trait ToCondition[T] {
  def apply(x: T): Boolean
}
implicit object ToConditionInt extends ToCondition[Int] {
  override def apply(x: Int) = x != 0
}
implicit object ToConditionString extends ToCondition[String] {
  override def apply(x: String) = throw new UnsupportedOperationException("Cannot use String as a condition")
}
implicit object ToConditionAnyRef extends ToCondition[AnyRef] {
  override def apply(x: AnyRef) = x != null
}

def toCondition[T: ToCondition](a: T): Boolean = implicitly[ToCondition[T]].apply(a)

toCondition(1) // true

toCondition(null:AnyRef) // false

toCondition("") // throws runtime

能否以某种方式表达此约束,以便我在编译时得到错误?

最佳答案

您可以将广义类型约束与永远不会为真的条件一起使用,例如String =:= Nothing:

implicit def ToConditionString(implicit ev: String =:= Nothing) = new ToCondition[String] {
  override def apply(x: String) = throw new UnsupportedOperationException("Cannot use String as a condition")
}

然后

toCondition("")

编译时失败:

could not find implicit value for evidence parameter of type ToCondition[String]

关于scala - 如何从 TypeClass 解析中排除特定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59355722/

相关文章:

haskell - GHC Haskell 当前的约束系统有什么问题?

c# - 自反类型参数约束 : X<T> where T : X<T> ‒ any simpler alternatives?

haskell - 向数据声明添加类型约束

Scala 类型类隐式解析

java - 将 python lambda 转换为 scala 或 java。使用 py4j 可以吗?

scala - 这个案例类匹配模式是如何工作的?

haskell - 在 Haskell 中提升类实例

scala - 如何获取 Spark 中线性回归等 ML 算法的所有超参数列表?

haskell - 为什么在引用 newtype 包装的数字类型时可以省略构造函数?

c# - 我可以规定 C# 类型参数只能是接口(interface)类型吗?