在类型中存储函数

时间:2016-11-06 15:33:35

标签: function types julia

通常人们想要定义他们的类型严格,同时对方法留下宽松的类型限制(因为后者将自动专门化,因此没有性能提升)。因此我知道,对于定义函数,使用::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。如果你想内联函数(并且这些类型是&#34;非常不变&#34;)那么第二个会更好吗?如果你要更改函数,第一个会更好吗?或者我是否想过这个?

1 个答案:

答案 0 :(得分:4)

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

例如,BaseVector{T},可用于Vector{Any}等特定情况和Vector{Int}等特殊情况,您也可以{ {1}}对TestType{T}TestType{Any}都有用。