E1013#
这个表达式的类型包含未解析的类型变量。
当编译器遇到无法从上下文确定的类型变量时,将会出现此错误。类型变量是应由编译器推断的类型的占位符。
常见情况:
编写没有明确类型注释的局部函数
创建空集合(数组,选项),而未指定其元素类型。
当编译器无法解析这些类型变量时,它将其默认为 Unit
类型,这可能并不是你所期望的。
错误示例#
pub fn f1() -> Unit {
fn f(x) {
// ^ Warning: The type of this expression is Option[_/0], which contains
// unresolved type variables. The type variable is default to
// Unit.
match x {
None => ()
Some(a) => println(a)
}
}
f(None)
}
pub fn f2() -> Unit {
fn f(x : Array[_]) -> Int {
// ^ Warning: The type of this expression is Array[_/0], which contains
// unresolved type variables. The type variable is default to
// Unit.
x.length()
}
println(f([]))
}
fn main {
let a = []
// ^^ Warning: The type of this expression is Array[_/0], which contains
// unresolved type variables. The type variable is default to Unit.
println(a.length())
let b = None
// ^^ Warning: The type of this expression is Option[_/0], which contains
// unresolved type variables. The type variable is default to Unit.
println(b.is_empty())
}
建议#
要修复这个警告,你可以:
为局部类型函数参数添加类型注释。例如:
pub fn f1() -> Unit {
fn f(x: Option[Int]) {
match x {
None => ()
Some(a) => println(a)
}
}
f(None)
}
pub fn f2() -> Unit {
fn f(x : Array[Int]) -> Int {
x.length()
}
println(f([]))
}
显式指定变量或集合元素的类型。
fn main {
let a : Array[Int] = []
println(a.length())
let b : Option[Int] = None
println(b.is_empty())
}
或者,等效地,在集合创建时添加类型注释。
fn main {
let a = ([] : Array[Int])
println(a.length())
let b = (None : Option[Int])
println(b.is_empty())
}
通过使用提供足够的上下文。
pub fn f1() -> Unit {
fn f(x) {
match x {
None => ()
Some(a) => println(a + 1)
// ^^^^^ through this usage, the compiler can infer the
// type of `x` is `Option[Int]`.
}
}
f(None)
}