Scala 斯卡拉:“我的朋友。”;泛化;超过单例类型?

Scala 斯卡拉:“我的朋友。”;泛化;超过单例类型?,scala,types,type-level-computation,singleton-type,Scala,Types,Type Level Computation,Singleton Type,在Scala中,值和对象具有单独指定给它们的单例类型。因此,我们可以: val x = 1 type X = x.type val y = 2 type Y = y.type 我可以写一个只以x为参数的方法吗 我试过: val x = 1 def foo(i: x.type ) = println(x.toString) 但这给了我一个错误。我认为这是在抱怨这种类型未知的事实。有没有一种方法可以指定i应该是int,这样我们就可以在它上面使用say.tofloat 上面的X和Y,即1和2

在Scala中,值和对象具有单独指定给它们的单例类型。因此,我们可以:

val x = 1
type X = x.type
val y = 2
type Y = y.type
  • 我可以写一个只以x为参数的方法吗
我试过:

val x = 1
def foo(i: x.type ) = println(x.toString)
但这给了我一个错误。我认为这是在抱怨这种类型未知的事实。有没有一种方法可以指定
i
应该是int,这样我们就可以在它上面使用say
.tofloat

  • 上面的
    X
    Y
    ,即
    1
    2
    的单例类型,有一个共同的祖先,因此我可以编写一个涉及单例类型say
    Int
    值的通用代码

  • 同样地

例如,如果我有

 val list = [1,2,3]

有没有一种编写代码的方法可以对这些值进行泛型,并且只能输入其中一个值?

在2.12.5中,它只适用于装箱的非原始整数:

val x: java.lang.Integer = 42
def foo(i: x.type): Unit = println(i.toFloat)
但是我不知道为什么它不适用于
valx:Int
。在Dotty中,它也适用于基本类型:

val x: Int = 42
def foo(i: x.type): Unit = println(x.toFloat)
对于多个值(列表),您可以进行枚举,或者简单地使用私有构造函数创建一个小类,并实例化伴随类中的所有有效值:

class SmallInt private(value: Int) {
  def asFloat = value.toFloat
}

object SmallInt {
  val one = new SmallInt(1)
  val two = new SmallInt(2)
  val three = new SmallInt(3)
}
这样就不会编译:

val foo = new SmallInt(345678) // forbidden
我写了一个只以x为参数的方法

如果它只能接受一个参数,那么就不需要

val x = 1
def f() = println(x.toString)
上面的X和Y,即1和2的单例类型,是否有一个共同的祖先,这样我就可以编写一个涉及单例类型say Int值的通用代码

我不明白。让函数以一组任意类作为输入的一种方法是使用隐式转换

trait CanUse{
    def use(): Int
}

def f[A](a: A)(implicit cvt: (A) => CanUse): Int = cvt(a).use() + 1
然后为每个可接受的输入类型定义隐式转换器

implicit class UsableInt(i: Int) extends CanUse{
   def use() = i
}

对我来说,
x.type
其中x是Int不起作用。如果
x
是一个
AnyRef
,例如
List
我发现你的评论非常模糊,那么它就可以工作。你能说得更具体一点吗?你是第一段代码(
valx=1;type x=x.type
等…)没有编译
found:x.type(具有基础类型Int)
required:AnyRef
Yep,只有对象具有单例类型。对于值,您必须等待即将发布的Scala版本中的文字类型。哦,这就解释了!)谢谢回复:
def()=…
duh!:这当然是一个最小的例子。我想做的是:
trait X{private val I:int;def foo(j:I.type)},这样
foo`只能用正确的值调用。我认为您应该更好地定义为什么希望foo只能用特定的值调用。如我所说,如果只是为了得到值,那么就不需要传递它。如果您有其他原因(我猜不出原因),您可能应该选择另一种设计这里是用例:谢谢。你能看看这个吗:这就是我问这个问题的原因。