具有类型推断的强类型语言如何处理未使用的返回值(在不明显的预期类型的情况下?)?
这是在未类型化的Python中发生这种情况的示例,当然它没有被捕获:
list(map(lambda item: item.some_method, some_collection))
这里是item.some_method
,因其副作用而被调用,因此正确的行是:
list(map(lambda item: item.some_method(), some_collection))
在类型化的编程语言中,item.some_method
将具有函数类型。如果不接受任何参数且不返回任何值,则它将具有() -> ()
类型,其中()
是unit type,表示一个微不足道的值。如果调用item.some_method
(这意味着隐式传递单位类型的唯一值),则会得到类型为()
的值,这也是微不足道的。
这里,item.some_method
和item.some_method()
具有不同的类型(分别为() -> ()
和()
),因此您将无法在强类型编程语言中使用一个代替另一个。 (在map
示例中,这有点微妙,因为您隐式地采用了A
类型的值,其中集合的范围超过了A
类型的值,但忽略了它。同样的原理适用,但是)
我建议您使用强类型语言,这很快就会变得很明显。