【发布时间】:2016-08-18 16:11:48
【问题描述】:
是否可以在 Julia 函数的数量上指定类型约束,例如:
function foo(bar::Function{1})
...
end
这个定义给了我一个错误:
ERROR: too many parameters for type Function
【问题讨论】:
是否可以在 Julia 函数的数量上指定类型约束,例如:
function foo(bar::Function{1})
...
end
这个定义给了我一个错误:
ERROR: too many parameters for type Function
【问题讨论】:
很可能需要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 的未来版本中发生变化。
【讨论】:
你的问题是不可能的,因为 Julia 函数没有明确定义的元数。
考虑
f(x) = "method 1"
f(x, y) = "method 2"
之后f 可以通过两种方式调用:
julia> f(0)
"method 1"
julia> f(0, 0)
"method 2"
那么,f 的数量是多少?如果您想根据函数的数量来改变函数的行为,那么您需要传入所需的数量作为附加参数。否则,可能会忽略元数检查。
【讨论】:
f 是一个定义了两个方法的单个函数。它有一种方法为 1,另一种方法为 2,但 f 本身没有明确定义的 arity。完成的确切计算并不重要。我已经对其进行了编辑以删除计算本身。
f(x) 是 F{1} 类型的对象,f(x, y) 是 F{2} 类型的对象。他们碰巧同名f。这是朱莉娅不禁止的事情。多次分派只是将名称f 解析为一个实例。类型约束如何使其失败?
f 的方法,而不是函数本身。 f 形影不离;调度是在运行时解决的,因此是动态调度。要从f 获取特定方法,必须调用which 函数:which(f, (Int, Int)),但这排除了已经知道所需的数量。