功能組合

我們可以使用匿名函式語法定義一個函式來執行函式組合

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)