Scala 斯卡拉:“我的朋友。”;泛化;超过单例类型?
在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
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
的单例类型,有一个共同的祖先,因此我可以编写一个涉及单例类型say2
值的通用代码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只能用特定的值调用。如我所说,如果只是为了得到值,那么就不需要传递它。如果您有其他原因(我猜不出原因),您可能应该选择另一种设计这里是用例:谢谢。你能看看这个吗:这就是我问这个问题的原因。