提问人:Nitin 提问时间:9/16/2023 更新时间:9/18/2023 访问量:74
Julia 中函数参数的条件
Condition on arguments of a function in Julia
问:
可以在 Julia 中指定函数的参数类型,例如: 。我可以同时定义另一个同名的函数:addition(x::Int64,y::Int64)
addition(x::Float64,y::Int64)
是否可以指定上述函数,以便我指定对值的限制或可以采用,而不是对类型的限制?因此,例如,我可以说,如果取值在 1.0 和 15.0 之间,则使用一个定义,如果它取值高于 15.0,则使用另一个定义。x
y
x
addition
所以基本上我想指定一个函数的参数可以接受的值范围,就像在 Mathematica 中一样,可以做到: .addition[i_, j_] /; 0.0 <= i <= 15.0 && 0.0 <= j <= 15.0 := i + j
谢谢!
答:
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)
但是有一个小问题 - 创建的函数类型不稳定,无法有效编译:value
ValT
这可能是一个问题,也可能不是一个问题,这取决于特定的用例场景,但基本上应该避免。
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是的,正是我的观点 - 但是,这个答案确实与我提出的要求相符,并且非常可以接受!
评论