功能組合
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)