scala中是否存在非类型模板参数?

scala中是否存在非类型模板参数?,scala,generics,pattern-matching,singleton-type,Scala,Generics,Pattern Matching,Singleton Type,在scala中可以有值泛型吗? 也就是说,泛型不是类型而是值。 我会想象它们看起来像这样:类动物[legs:Int],但它不编译 我已经设法把它编译好了,但我不确定编译器是否能像我一样理解它 抽象密封类轮式车辆(车轮:Int) 案例对象摩托车四轮车(2) 案例对象Atv四轮车(4) 案例对象车延伸四轮车(4) 案例对象卡车延伸四轮车辆(6) 此外,我还无法匹配车辆的值 车辆匹配{ 案例:带轮车辆(2)=>使用两个车轮() 案例:有轮车辆(4)=>使用四轮() 案例:带轮车辆(6)=>使用六个车

在scala中可以有值泛型吗? 也就是说,泛型不是类型而是值。 我会想象它们看起来像这样:
类动物[legs:Int]
,但它不编译

我已经设法把它编译好了,但我不确定编译器是否能像我一样理解它

抽象密封类轮式车辆(车轮:Int)
案例对象摩托车四轮车(2)
案例对象Atv四轮车(4)
案例对象车延伸四轮车(4)
案例对象卡车延伸四轮车辆(6)
此外,我还无法匹配
车辆的

车辆匹配{
案例:带轮车辆(2)=>使用两个车轮()
案例:有轮车辆(4)=>使用四轮()
案例:带轮车辆(6)=>使用六个车轮()
}

值泛型存在于其他一些语言中,如C++。 但是在斯卡拉呢?


如果他们不这样做,有没有其他方法来做我想做的事情?

似乎您只想不加应用地定义自定义

abstract sealed class WheeledVehicle(val wheels: Int)
object WheeledVehicle {
  def unapply(arg: WheeledVehicle): Option[Int] = Some(arg.wheels)
}

vehicle match {
  case WheeledVehicle(2) => useTwoWheels()
  case WheeledVehicle(4) => useFourWheels()
  case WheeledVehicle(6) => useSixWheels()
}
摩托车
将匹配第一种模式,
亚视
汽车
将匹配第二种模式,
卡车
将匹配第三种模式


假设C++中的值泛型是指斯卡拉不直接支持它们,但可以用单体类型做一些相同的事情,尤其是:


我想增加更多的车辆,但对于这场比赛,我只关心车辆有多少个车轮。我很难理解你在说什么。我以前从未听说过“值泛型”这个词。我不熟悉C++,你说它有价值泛型,所以这可能是我不认识这个词的原因。然而,我在ISO C++规范中找不到任何“价值泛型”,也没有在任何C++书籍上或在谷歌上找到。鉴于这似乎不是一个被广泛认可的术语,如果您提供一个您认为值泛型应该具有的语义的精确定义,可能会有所帮助。特别是因为您的示例都与泛型没有任何关系,现有的、经过投票表决的答案也没有任何关系。
abstract sealed class WheeledVehicle(val wheels: Int)

vehicle match {
  case w: WheeledVehicle if w.wheels == 2 => useTwoWheels()
  case w: WheeledVehicle if w.wheels == 4 => useFourWheels()
  case w: WheeledVehicle if w.wheels == 6 => useSixWheels()
}
vehicle match {
  case _ if vehicle.wheels == 2 => useTwoWheels()
  case _ if vehicle.wheels == 4 => useFourWheels()
  case _ if vehicle.wheels == 6 => useSixWheels()
}
if (vehicle.wheels == 2) useTwoWheels()
else if (vehicle.wheels == 4) useFourWheels()
else if (vehicle.wheels == 6) useSixWheels()
else useDefault()
class Animal[Legs <: Int with Singleton]

val x = new Animal[10]
class Animal[Legs <: Int with Singleton](implicit v: ValueOf[Legs]) {
  def legs = v.value
}

val x = new Animal[10]
println(x.legs)
def f[N <: Int with Singleton](vehicle: WheeledVehicle[N]) = useNWheels[N]()

def useNWheels[N <: Int with Singleton]() = ...