功能组合

我们可以使用匿名函数语法定义一个函数来执行函数组合

f ∘ g = x -> f(g(x))

请注意,此定义等效于以下每个定义:

∘(f, g) = x -> f(g(x))

要么

function ∘(f, g)
    x -> f(g(x))
end

回想起在朱莉娅,f ∘ g 只是∘(f, g) 的语法糖。

我们可以看到这个函数组成正确:

julia> double(x) = 2x
double (generic function with 1 method)

julia> triple(x) = 3x
triple (generic function with 1 method)

julia> const sextuple = double ∘ triple
(::#17) (generic function with 1 method)

julia> sextuple(1.5)
9.0

Version >= 0.5.0

在版本 v0.5 中,此定义非常高效。我们可以查看生成的 LLVM 代码:

julia> @code_llvm sextuple(1)

define i64 @"julia_#17_71238"(i64) #0 {
top:
  %1 = mul i64 %0, 6
  ret i64 %1
}

很明显,这两个乘法已被折叠成单个乘法,并且该函数尽可能高效。

这个高阶函数如何工作?它创建了一个所谓的闭包 ,它不仅包含其代码,还包含其范围内的某些变量。Julia 中未在顶级范围创建的所有函数都是闭包。

Version >= 0.5.0

可以通过闭包的字段检查关闭的变量。例如,我们看到:

julia> (sin ∘ cos).f
sin (generic function with 10 methods)

julia> (sin ∘ cos).g
cos (generic function with 10 methods)