如何在不牺牲性能的情况下将函数作为参数传递给Julia中的其他函数?

Phi*_*lip 9 performance functional-programming function anonymous-function julia

编辑尝试解决@ user2864740的编辑和评论:我想知道是否有任何与0.4rc1/rc2特别相关的信息,或者特别是来自其中一个Julia开发人员的策略或建议比下面引用的更近(特别是@ StefanKarpinski的Jan 2014年答案在#6下面).谢谢

请参阅例如

  1. https://groups.google.com/forum/#!topic/julia-users/pCuDx6jNJzU
  2. https://groups.google.com/forum/#!topic/julia-users/2kLNdQTGZcA
  3. https://groups.google.com/forum/#!msg/julia-dev/JEiH96ofclY/_amm9Cah6YAJ
  4. https://github.com/JuliaLang/julia/pull/10269
  5. https://github.com/JuliaLang/julia/issues/1090
  6. 我可以将类型信息添加到Julia中的函数参数吗?
  7. 在Julia中使用匿名函数的性能损失

(作为一个相当缺乏经验的Julia用户)我对这些信息的最佳综合,其中一些似乎已过时,最佳做法是"避免这样做"或"使用FastAnonymous.jl".

我想知道最新的最新方法和最好的方法是什么.

[更长版本:]

特别是,假设我有一个很大的功能层次结构.我希望能够做类似的事情

function transform(function_one::Function{from A to B},
                   function_two::Function{from B to C},
                   function_three::Function{from A to D})
    function::Function{from Set{A} to Dict{C,D}}(set_of_As::Set{A})
        Dict{C,D}([function_two(function_one(a)) => function_three(a)
                   for a in set_of_As])
    end
end
Run Code Online (Sandbox Code Playgroud)

请不要太过字面意思.这是一个更为一般的转换形式的狭隘例子,无论转换的具体细节如何,我都希望能够做到这一点,但我想以这样的方式做到这一点,我不必担心(太多)关于检查性能(即,除了我在任何非函数与函数作为参数的情况下应用的正常担忧)每次我写一个行为这样的函数.

例如,在我理想的世界中,正确的答案是"只要你@anon在用这些函数作为参数调用这个函数之前注释每个输入函数,那么你就可以做到尽可能好,而无需调整到你传递的具体论据的具体情况."

如果这是真的,很好 - 我只是想知道这是否是正确的解释,或者如果没有,如果有一些资源我可以阅读这个主题更接近"逻辑"呈现的综合比这里的链接集合(在这个问题上,这更像是集体意识或思想史的流.

tho*_*oly 7

答案仍然是"使用FastAnonymous.jl",或手动创建"函子类型"(请参阅​​NumericFuns.jl).

如果您正在使用julia 0.4,FastAnonymous.jl的工作方式与官方"快速关闭"最终将在基础julia中的工作方式基本相同.请参阅https://github.com/JuliaLang/julia/issues/11452#issuecomment-125854499.(FastAnonymous在julia 0.3上以非常不同的方式实现,并且有更多的弱点.)