如何向Scala编译器证明集合具有正确类型的元素?

如何向Scala编译器证明集合具有正确类型的元素?,scala,Scala,我想做如下工作: val foo=List[B您可以使用一组简单的隐式函数来启用转换 class JValue implicit intToJValue(x: Int) = new JValue implicit stringToJValue(x: String) = new JValue val xs: List[JValue] = List(1, "hello") 对于第二个问题,您可以通过以下方式启用批发列表转换: implicit def listToJList[A <% JV

我想做如下工作:


val foo=List[B您可以使用一组简单的隐式函数来启用转换

class JValue
implicit intToJValue(x: Int) = new JValue
implicit stringToJValue(x: String) = new JValue

val xs: List[JValue] = List(1, "hello")
对于第二个问题,您可以通过以下方式启用批发列表转换:

implicit def listToJList[A <% JValue](xs: List[A]): List[JValue] = xs
def foo[A <% JValue](x: List[A]): List[JValue] = x

implicit def listToJList[A您可以使用一组简单的implicit来启用转换

class JValue
implicit intToJValue(x: Int) = new JValue
implicit stringToJValue(x: String) = new JValue

val xs: List[JValue] = List(1, "hello")
对于第二个问题,您可以通过以下方式启用批发列表转换:

implicit def listToJList[A <% JValue](xs: List[A]): List[JValue] = xs
def foo[A <% JValue](x: List[A]): List[JValue] = x
implicit def listToJList[A您可以编写

val foo: List[JValue] = List(42, "hello")
如果没有从这些类型到
JValue
的隐式转换,则不会进行类型检查

不幸的是,您不能将其编写为
42::“hello”::Nil
,因为编译器不够聪明,无法知道您想要在每个术语上应用转换(您可以在每个术语上添加一个类型注释,但这很麻烦)。每个
::
方法都必须以某种方式一直向前看,直到表达式的结尾,以检查是否有某个稍后的方法使其适合类型参数

但是,如果您想添加自己的funky运算符,可以约束
允许的类型:

implicit class pimp(xs: List[JValue]) {
  def |: (x: JValue) = x :: xs
}
之后,你可以写这样的东西:

val foo = 42 |: "hello" |: Nil
  // type is List[JValue]
(我尝试将其参数化,以便推断出最具体的通用类型,就像
那样,但编译器不想玩上限-。如果可能的话,也许有人可以用更多的Scala fu来修复它。)

您可以编写

val foo: List[JValue] = List(42, "hello")
如果没有从这些类型到
JValue
的隐式转换,则不会进行类型检查

不幸的是,您不能将其编写为
42::“hello”::Nil
,因为编译器不够聪明,无法知道您想要在每个术语上应用转换(您可以在每个术语上添加一个类型注释,但这很麻烦)。每个
::
方法都必须以某种方式一直向前看,直到表达式的结尾,以检查是否有某个稍后的方法使其适合类型参数

但是,如果您想添加自己的funky运算符,可以约束
允许的类型:

implicit class pimp(xs: List[JValue]) {
  def |: (x: JValue) = x :: xs
}
之后,你可以写这样的东西:

val foo = 42 |: "hello" |: Nil
  // type is List[JValue]

(我尝试将其参数化,以便它可以推断出最具体的公共类型,就像
那样,但是编译器不想玩上限-。如果可能的话,也许有人可以用更多的Scala fu来修复它。)

对的
方法进行了一些改进:

你可以写

val foo: List[JValue] = 42 :: "hello" :: HNil
通过适当的隐式转换(使用):

导入无形状_

trait hlistconv[H对
|:
方法的一点改进:

你可以写

val foo: List[JValue] = 42 :: "hello" :: HNil
通过适当的隐式转换(使用):

导入无形状_

trait hlistconv[H HLists?()错误消息是什么?您是否尝试过
(42:JValue)::(“hello”:JValue)::Nil
?HLists?()错误消息是什么?您是否尝试过
(42:JValue)::(“hello”:JValue)::Nil