代码之家  ›  专栏  ›  技术社区  ›  Maths noob

scala:单例类型的泛化?

  •  1
  • Maths noob  · 技术社区  · 6 年前

    在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,以便我们可以使用 .tofloat 在上面?

    • X Y 上面,即 1 和; 2 有一个共同的祖先,所以我可以编写一个涉及单体类型的泛型代码。 Int 价值观。

    • 同样地,

    例如,如果我有

     val list = [1,2,3]
    

    有没有办法编写一个代码来概括这些代码,并且只能给这些值中的一个提供?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Juh_    6 年前

    我写了一个只以x为参数的方法?

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

    val x = 1
    def f() = println(x.toString)
    

    X和Y上面的,即1和2的单体类型,有一个共同的祖先,所以我可以编写一个涉及单值类型的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
    }
    
        2
  •  1
  •   Andrey Tyukin    6 年前

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

    val x: java.lang.Integer = 42
    def foo(i: x.type): Unit = println(i.toFloat)
    

    我不知道为什么不管用 val x: 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