scala:按类型联合参数化
scala: Parameterize by Type Union
我需要一个类型联合来强制限制类型,所以根据 here 中的回答,我将我的联合定义为:
sealed trait Value[T]
object Value{
implicit object NumberWitness extends Value[Int]
implicit object StringWitness extends Value[String]
}
现在,我如何创建一个列表或 class 由这种联合类型参数化?这样做可以吗??我在 repl 中尝试了以下语法,但没有任何运气:
scala> import Value._
import Value._
scala> def list[V: Value] = List("hello", 1)
list: [V](implicit evidence: Value[V])List[Any]
scala> list
<console>:18: error: ambiguous implicit values:
both object NumberWitness in object Value of type Value.NumberWitness.type
and object StringWitness in object Value of type Value.StringWitness.type
match expected type Value[V]
list
^
或者是否可以使用像 scalaz 或 cats 这样的高级 FP 库来做到这一点?
这叫做类型class,不是类型联合。它们的目的是让您编写可以 与 Int
或 String
一起工作的方法,例如
def listOfValues[V: Value](x: V) = List(x)
listOfValues(1) // works
listOfValues("") // works
listOfValues(0.0) // doesn't work
listOfValues(1, "") // doesn't work
不允许混合不同类型。
您可以使用存在类型来做到这一点,例如
case class WithValue[V: Value](x: V)
object WithValue {
implicit def withValue[V: Value](x: V) = WithValue(x)
}
def list = List[WithValue[_]]("hello", 1)
但我不建议实际这样做。很可能有更好的方法来解决您的问题。
特别是考虑简单地使用
// not sealed if you need to add other types elsewhere
// can be Value[T] instead
sealed trait Value
case class IntValue(x: Int) extends Value
case class StringValue(x: Int) extends Value
// add implicit conversions to IntValue and StringValue if desired
List(StringValue("hello"), IntValue(1))
我需要一个类型联合来强制限制类型,所以根据 here 中的回答,我将我的联合定义为:
sealed trait Value[T]
object Value{
implicit object NumberWitness extends Value[Int]
implicit object StringWitness extends Value[String]
}
现在,我如何创建一个列表或 class 由这种联合类型参数化?这样做可以吗??我在 repl 中尝试了以下语法,但没有任何运气:
scala> import Value._
import Value._
scala> def list[V: Value] = List("hello", 1)
list: [V](implicit evidence: Value[V])List[Any]
scala> list
<console>:18: error: ambiguous implicit values:
both object NumberWitness in object Value of type Value.NumberWitness.type
and object StringWitness in object Value of type Value.StringWitness.type
match expected type Value[V]
list
^
或者是否可以使用像 scalaz 或 cats 这样的高级 FP 库来做到这一点?
这叫做类型class,不是类型联合。它们的目的是让您编写可以 与 Int
或 String
一起工作的方法,例如
def listOfValues[V: Value](x: V) = List(x)
listOfValues(1) // works
listOfValues("") // works
listOfValues(0.0) // doesn't work
listOfValues(1, "") // doesn't work
不允许混合不同类型。
您可以使用存在类型来做到这一点,例如
case class WithValue[V: Value](x: V)
object WithValue {
implicit def withValue[V: Value](x: V) = WithValue(x)
}
def list = List[WithValue[_]]("hello", 1)
但我不建议实际这样做。很可能有更好的方法来解决您的问题。
特别是考虑简单地使用
// not sealed if you need to add other types elsewhere
// can be Value[T] instead
sealed trait Value
case class IntValue(x: Int) extends Value
case class StringValue(x: Int) extends Value
// add implicit conversions to IntValue and StringValue if desired
List(StringValue("hello"), IntValue(1))