2016-11-06 9 views
3

Обычно каждый хочет определить их типы строгими и оставляя свободные ограничения типа для методов (так как последние будут автоматически специализироваться, поэтому нет увеличения производительности). Таким образом, я знаю, что для определения функций использование ::Base.Callable является хорошей практикой. Однако, как насчет хранения функций внутри типов?Хранение функций внутри типов

В v0.5, Function и Base.Callable являются абстрактными типами, и поэтому типа

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

не будет строго типизированным. Его можно было бы строго напечатать, используя

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

, который затем будет производить разные типы для каждой функции.

Каковы преимущества и недостатки различных подходов? Похоже, что второй метод заставит любой g(t::TestType) перекомпилировать для каждой функции ввода, тогда как первый метод не будет иметь строго типизированный код f. Так будет второй лучше, если вы хотите встроить функции (и эти типы «довольно постоянны»), и первое будет лучше, если вы будете много менять функции? Или я переусердствую это?

+1

Лично я пошел бы дальше и рекомендовал 'Any' вместо' Base.Callable', чтобы захватить такие ситуации, как 'Polynomial'. –

+1

Да, это компромиссы. Не уверен, что за этим стоит ответ. –

ответ

4

Лично, когда я нахожусь на заборе, я предпочитаю параметризованную версию, потому что она более общая. Это просто сделать TestType{Any} или TestType{Function}, если у вас есть параметризованные типы, и эти типы будут вести себя точно так же, как и непараметрированный TestType.

Например, Base имеет Vector{T}, которая может быть использована как для конкретных случаев, как Vector{Any} и особых случаях, как Vector{Int}, и в том же духе, вы могли бы TestType{T}, которые могут быть полезны как для TestType{Any} или TestType{typeof(sin)}.