在Julia函数声明的上下文中,“where {t :< Integer}”是什么意思?

6
我在别人的代码中看到过以下内容,但我从未在自己的代码中编写过,因为我不明白发生了什么。
例如: function add(x::T, y::T) where {T :< Integer}
我猜测T被强制转换为Integer然后用于显式类型化x和y。但为什么不直接使用x :: Int64呢?where {T :< Integer}是否允许任何Int类型,如Int32和Int64?
2个回答

6

稍微补充一下Oscar的回答:

使用 function add(x::T, y::T) where {T :< Integer} 可以将一个参数化方法添加到函数 add(x, y) 中。您可以在Julia文档参数化方法部分中详细了解这个问题。

这带来了两个重要的优点: 它允许您定义相当通用的方法(因为在许多情况下,整数的确切类型实际上不会影响函数定义)。同时,它允许您限制对相同类型的 x, y 对的调用,这可以提高类型稳定性并导致更有效的编译代码。


4

function add(x::T, y::T) where {T :< Integer}的意思是,可以在类型为同一子类型Integer的任意2个变量上调用该函数。这包括了两个bigInt之类的数据类型,但不包括1个Int64和1个Int32之类的情况。这被称为对角线派发,是一种非常有用的模式。


那么所有的函数都应该动态地接受不同类型的输入吗? - logankilpatrick
“所有”可能有点过于宽泛,但我想你能明白我的意思。 - logankilpatrick
1
通常最佳实践是将函数类型定义为接受其能够处理的最大类型。请注意,这不是动态接受类型,因为这些函数允许的类型在编译时确定,如果您的代码类型稳定,则分派也将发生在编译时。 - Oscar Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接