如何向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
?