【问题标题】:Storing Functions inside of Types在类型中存储函数
【发布时间】:2017-03-19 23:10:33
【问题描述】:

通常人们想要严格定义他们的类型,同时对方法留下宽松的类型限制(因为后者会自动专门化,因此没有性能提升)。因此我知道对于定义函数,使用::Base.Callable 是一种很好的做法。但是,在类型内部存储函数时呢?

在 v0.5 中,FunctionBase.Callable 都是抽象类型,因此类型

type TestType
  f::Base.Callable # or ::Function
end

不会严格输入。可以通过使用来严格输入

type TestType{T<:Base.Callable}
  f::T
end

然后将为每个函数生成不同的类型。

不同方法的优缺点是什么?似乎第二种方法会导致任何g(t::TestType) 为每个输入函数重新编译,而第一种方法不会严格键入f。那么,如果您想内联函数(并且这些类型“几乎是恒定的”),那么第二个会更好,如果您要大量更改函数,第一个会更好吗?还是我想多了?

【问题讨论】:

  • 我个人会更进一步,推荐Any 而不是Base.Callable,以捕捉Polynomial 之类的情况。
  • 是的,这些都是权衡。不知道除此之外还有其他答案。

标签: function types julia


【解决方案1】:

就我个人而言,我更喜欢参数化版本,因为它更通用。 TestType{Any}TestType{Function} 如果您有参数化类型,则很简单,并且这些类型的行为与未参数化的 TestType 完全相同。

例如,Base 具有 Vector{T},可用于Vector{Any} 之类的特定情况和Vector{Int} 之类的特殊情况,类似地,您可以使用TestType{T},这对两者都有用TestType{Any}TestType{typeof(sin)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多