是否可以在Julia函数的arity上指定类型约束,例如:
function foo(bar::Function{1})
...
end
这个定义给了我一个错误:
ERROR: too many parameters for type Function
答案 0 :(得分:3)
你问的是不可能的,因为Julia函数没有明确定义的arity。
考虑
f(x) = "method 1"
f(x, y) = "method 2"
之后可以通过两种方式调用f
:
julia> f(0)
"method 1"
julia> f(0, 0)
"method 2"
那么,f
的精神是什么?如果您正在寻求根据其arity更改函数的行为,则需要将所需的arity作为附加参数传递。否则,可能会遗漏arity check。
答案 1 :(得分:3)
最有可能的是,需要arity约束来确保参数的正确性。这不需要在函数签名中完成,但可以使用函数代码顶部的参数检查来完成。一种方法可能是:
if !any(m->length(m.sig.parameters)==2, methods(bar))
error("bar must be callable with 2 parameters")
end
也可以对bar
的签名进行更详细的检查。
函数foo
的声明参数类型惯用于通过类型推断和多次调度来指导优化,而不是用于验证参数。
请注意,使用MethodTable和Method类型的内部结构并非官方Julia规范,并且可能会在Julia的未来版本中进行更改。