具有类型推断的强类型语言如何处理未使用的返回值(在不明显的预期类型的情况下?)?
发生这种情况的一个示例是,如果lambda意外返回了函数本身,而不是执行结果。例如,在python中(显然,没有输入,所以这只是一个例子),可能会写错:
list(map(lambda item: item.some_method, some_collection))
而不是
list(map(lambda item: item.some_method(), some_collection))
some_method
方法不返回任何内容(可能只是更新item
的内部结构,或具有其他副作用)。开发人员期望结果列表为[None, ...]
,而实际上为[item_0.some_method, ...]
。
在类型化的编程语言中,item.some_method
将具有函数类型。如果不接受任何参数且不返回任何值,则它将具有() -> ()
类型,其中()
是unit type,表示一个微不足道的值。如果调用item.some_method
(这意味着隐式传递单位类型的唯一值),则会得到类型为()
的值,这也是微不足道的。
这里,item.some_method
和item.some_method()
具有不同的类型(分别为() -> ()
和()
),因此您将无法在强类型编程语言中使用一个代替另一个。 (在map
示例中,这有点微妙,因为您隐式地采用了A
类型的值,其中集合的范围超过了A
类型的值,但忽略了它。同样的原理适用,但是)
我建议您使用强类型语言,这很快就会变得很明显。