【问题标题】:Arity constraint on Julialang function typeJulialang 函数类型的 Arity 约束
【发布时间】:2016-08-18 16:11:48
【问题描述】:

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

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

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

ERROR: too many parameters for type Function

【问题讨论】:

    标签: function types julia


    【解决方案1】:

    很可能需要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 的未来版本中发生变化。

    【讨论】:

    • 这看起来很像 R 或 Matlab。拥有静态类型系统的全部意义在于能够在类型系统级别上处理此类约束。
    • Julia 是一种解释型(尽管有预编译)语言。这意味着,类型在程序运行时被分配和定义。参数约束有助于选择特别优化的函数版本来调用(和初始编译)。是的,它看起来确实像 R 或 Matlab,因为它们也被解释了。顺便说一句,即使存在 arity 约束,人们也会问:为什么不限制参数函数的整个签名? - 建议的检查在没有开销的情况下给出相同的效果,在完美的世界中,这样的检查会反正没必要。
    • 话虽如此,您可以传递一个自定义类型,而不是传递一个通用函数,该类型将支持调用方法上的这一要求。这与 Mauro 和 Tim Holy 的 Traits 技巧有关。这可能会带来一些速度优势,但它可能与答案中的解释检查一起使用。 (见github.com/mauro3/Traits.jl)。
    • @DanGetz 我不会把 Julia 称为解释语言,因为它总是编译为本机代码(尽管我相信在 Julia 中添加对 AST 的解释的工作正在进行中,而不是总是编译)。 (我之前也研究过一些真正被解释过的语言)。您确实需要知道编译发生的时间,尤其是。使用宏,这可能很棘手,当宏本身被编译时会发生什么,以及在其他地方的代码编译期间使用它时会发生什么。
    • 您所做的区别(关于如何动态分配和定义类型)实际上是动态与静态类型语言之间的区别,而不是解释与编译语言之间的区别。 (还有强类型和弱类型之间的区别)。 Julia IMO 是一种强动态类型的编译语言。
    【解决方案2】:

    你的问题是不可能的,因为 Julia 函数没有明确定义的元数。

    考虑

    f(x) = "method 1"
    f(x, y) = "method 2"
    

    之后f 可以通过两种方式调用:

    julia> f(0)
    "method 1"
    
    julia> f(0, 0)
    "method 2"
    

    那么,f 的数量是多少?如果您想根据函数的数量来改变函数的行为,那么您需要传入所需的数量作为附加参数。否则,可能会忽略元数检查。

    【讨论】:

    • 第一种情况:arity = 1,第二种情况arity = 2。重要的部分是签名,而不是计算。
    • 这个不会像mrdivide那么简单:)
    • @ArtemOboturov:因为multiple dispatch,f 是一个定义了两个方法的单个函数。它有一种方法为 1,另一种方法为 2,但 f 本身没有明确定义的 arity。完成的确切计算并不重要。我已经对其进行了编辑以删除计算本身。
    • 我可能错过了什么吗? f(x) 是 F{1} 类型的对象,f(x, y) 是 F{2} 类型的对象。他们碰巧同名f。这是朱莉娅不禁止的事情。多次分派只是将名称f 解析为一个实例。类型约束如何使其失败?
    • @ArtemOboturov 您说的是f 的方法,而不是函数本身。 f 形影不离;调度是在运行时解决的,因此是动态调度。要从f 获取特定方法,必须调用which 函数:which(f, (Int, Int)),但这排除了已经知道所需的数量。
    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 2020-02-26
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多