【问题标题】:Understanding parameter types during multidimensional array creation了解多维数组创建期间的参数类型
【发布时间】:2020-11-15 09:51:54
【问题描述】:

我正在尝试解析在以下代码中创建的参数类型 type _1 >: Char with Int <: AnyVal 的含义(使用 Scala ammonite repl)。我正在定义一个数组数组

  • with 在这种情况下是什么意思,我们是否定义了一个具有 Int 'traits' 的新 Char 类?
  • 表达式>: Char with Int <: AnyVal 是否意味着 - 任何类型 (_1) 是 Char 的超类型和 Int 但 AnyVal 的子类型?
@ val tmix1 = Array(Array[Int](1,2,3), Array[Char]('b','f')) 
tmix1: Array[Array[_1] forSome { type _1 >: Char with Int <: AnyVal }] 
= Array(Array(1, 2, 3), Array('b', 'f'))

【问题讨论】:

  • 你有一个整数数组和另一个字符数组,如果你创建一个包含两者的数组,你最终会得到一个数组数组,它​​要么是字符,要么是整数。所以,一些无用的东西。如果您正在学习语言理解类型将是第一步(顺便说一句,除非您需要数组,否则请远离数组,使用列表或任何其他真正的集合)
  • 谢谢,是的,这是一个玩具示例,试图弄清楚 (type _1 ) 是如何创建的
  • 被称为存在类型。所以它说它是某个类型XArray[Array[X]],它既是Char with Int 的超类型,也是AnyVal 的子类型。
  • 请注意,需要 forSome 语法的存在类型将在 Scala 3 中删除。只留下可以使用 _ 语法(通配符类型)编写的存在类型。

标签: arrays scala types existential-type


【解决方案1】:

表达式 >: Char with Int <: anyval char int>

是的,这是正确的。

我们是否使用 Int 的“特征”定义了一个新的 Char 类

我们没有定义任何东西。 你在写 'x: Int => String' 时定义了一个 'class' 吗?不,它只是类型表达式。 这是一种允许您表达类型的语法。使用关键字“with”,您可以构造一个类型,它是 Char 的子类型和 Int 的子类型。此表达式可用作联合类型编码 (https://stackoverflow.com/a/6883076/14044371)。联合类型是一种在单个类型中将几个类型与逻辑“或”组合在一起的类型。它也称为“类型析取”。您可以通过想象示例来直观地理解这一点:

// what is the possible supertypes for type 'Char with Int'?
// it is 'Char with Int',  Int, Char, AnyVal, Any 
val x: Char with Int = Char with Int
val a: Int = Char with Int
val b: Char = Char with Int
val c: AnyVal = Char with Int
val d: An y= Char with Int

所以T &gt;: Char with IntT &lt;: AnyVal 几乎等同于Char Or Int

对于Char Or Int 的直觉,我可以给你这个:

val a: Char Or Int = 1 // is it correct? yes it is
val b: Char Or Int = 'a' // it is correct too
// after that, you can pattern match on such type in a safe manner
def foo(x: Char Or Int) match {
  case Int => ...
  case Char => ...
}

所以。

你的第二个问题是正确的。

你一开始不太对,因为它不是“类”或“特征”——它是类型表达式。这不直观,因为您在类和特征的继承中具有相同的单词“with”。但是这个词在不同的语境中的含义略有不同。

这种构造是表达联合类型的方式,它非常适合原始表达式val tmix1 = Array(Array[Int](1,2,3), Array[Char]('b','f'))的类型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2011-08-19
    • 2013-04-21
    相关资源
    最近更新 更多