Julia 中函数参数的条件

Condition on arguments of a function in Julia

提问人:Nitin 提问时间:9/16/2023 更新时间:9/18/2023 访问量:74

问:

可以在 Julia 中指定函数的参数类型,例如: 。我可以同时定义另一个同名的函数:addition(x::Int64,y::Int64)addition(x::Float64,y::Int64)

是否可以指定上述函数,以便我指定对值的限制或可以采用,而不是对类型的限制?因此,例如,我可以说,如果取值在 1.0 和 15.0 之间,则使用一个定义,如果它取值高于 15.0,则使用另一个定义。xyxaddition

所以基本上我想指定一个函数的参数可以接受的值范围,就像在 Mathematica 中一样,可以做到: .addition[i_, j_] /; 0.0 <= i <= 15.0 && 0.0 <= j <= 15.0 := i + j

谢谢!

函数 方法 条件语句 Julia Wolfram-Mathematica

评论

1赞 Antonello 9/16/2023
你当然可以将特定于范围的“加法”包装在一个包装器加法函数中,你可以理解逻辑,我不认为(但我可能是错的)你可以用多重调度机制来做到这一点。
0赞 Nitin 9/16/2023
@Antonello谢谢,我一直在寻找一种像 Mathematica 一样的方法,但是是的,包装会起作用
1赞 Antonello 9/16/2023
我不认为 Mathematica 应用基于值的多重调度。您可以像在 Mathematica 中一样将条件语句写在一行中。

答:

2赞 Przemyslaw Szufel 9/17/2023 #1

在类型中,您可以保存具体信息并使用它来调度。 举个例子,你可以做

struct ValT{T}
    x::Float64
end

您可以拥有以下对象:

a=ValT{:small}(3)
b=ValT{:big}(100)

您可以相应地调度:

f(u::ValT{:big}) = u.x + 1000;
f(u::ValT{:small}) = u.x + 10;

唯一的问题是,这些值在运行时而不是编译时是已知的,并且创建的函数不会是类型稳定的。ValT{}

考虑:

value(x) = ValT{x < 5 ? :small : :big}(x)

此函数可用于方便地创建具有适合您需求的类型的对象。

julia> value(4)
ValT{:small}(4.0)

julia> value(40)
ValT{:big}(40.0)

但是有一个小问题 - 创建的函数类型不稳定,无法有效编译:valueValT```
``

这可能是一个问题,也可能不是一个问题,这取决于特定的用例场景,但基本上应该避免。

1赞 DNF 9/18/2023 #2

Mathematica 在这里所做的并没有什么特别之处,历史上的每一种编程语言都可以做到这一点,Julia 也是如此。

addition[i_, j_] /; 0.0 <= i <= 15.0 && 0.0 <= j <= 15.0 := i + j

成为

addition(i, j) = (0<=i<=15) && (0<=i<=15) && return i+j

但是,如果输入不在范围内,函数应该怎么做?现在它会回来.nothing

评论

1赞 mcabbott 9/19/2023
也许更确切地说。但是 Mathematica 在这里所做的(我认为)有点不同。 有条件地附加此定义,但也可以附加后面的定义,并且始终使用最具体的匹配定义。这很像 Julia 的调度,您可以随时添加更多方法。但它不仅允许值,还允许类型——语言更加动态,实际上没有编译时的概念。(他们的帮助:reference.wolfram.com/language/ref/Condition.htmlfalse/; )
0赞 Nitin 9/27/2023
@mcabbott是的,正是我的观点 - 但是,这个答案确实与我提出的要求相符,并且非常可以接受!