Julialang函数类型的Arity约束

时间:2016-04-25 10:15:58

标签: function types julia

是否可以在Julia函数的arity上指定类型约束,例如:

function foo(bar::Function{1})
  ...
end

这个定义给了我一个错误:

ERROR: too many parameters for type Function

2 个答案:

答案 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的未来版本中进行更改。