跳到主要内容

Julia 函数

阐述

函数接受一定的输入并返回一定的输出。一个函数可以包括多个不同的 Julia 方法。可以用块形式和赋值形式定义。函数调用为传地址调用。

函数在第一个方法被定义时创建,或者也可以定义一个不包含任何方法的函数:

function emptyfunc end

每个在顶层定义的函数都有与之对应的一个 Julia 单例类型,且这个类型是 Function 的子类型。但是匿名函数不一定是单例类型。

函数类型的单例化使得高阶函数可以轻易地对作为参数的函数特化,编译出高效的代码。

julia> foo41(x) = x + 1
foo41 (generic function with 1 method)

julia> typeof(foo41)
typeof(foo41) (singleton type of function foo41, subtype of Function)

参数

函子

任何 Julia 对象都可以通过添加调用方法的方式来让它变得可以调用。

julia> struct Polynomial{R}
coeffs::Vector{R}
end

julia> function (p::Polynomial)(x)
v = p.coeffs[end]
for i = (length(p.coeffs)-1):-1:1
v = v*x + p.coeffs[i]
end
return v
end

在 Julia 内部,普通的函数也是通过(无字段的)函子来实现的,所以二者本质上是一样的。

do 块定义的函数

接收函数作为第一个实参的高阶函数可以将该参数用 do ... end 块后置。do 后不需要加括号。

map([A, B, C]) do x
if x < 0 && iseven(x)
return 0
elseif x == 0
return 1
else
return x
end
end

实例

定义

function f(x, y)
x + y
end
f(x, y) = x + y
f = x -> x + 1

性质

两种不同的组合函数的方式

复合运算符(从右向左运算)

(sqrt ∘ +)(3, 6)

管线运算符(从左向右运算)

1:10 |> sum |> sqrt

相关内容

文档模板

给函数写文档时,应该尽可能给函数本身或最宽泛的方法写,如果有必要再给其他方法写。

以下模板参考了 Julia SciML 风格指南和官方文档。

  1. 四个空格缩进的函数签名
  2. 一句话描述函数的行为,如有必要可以再加一段话详细描述
  3. 如有必要,提供 # Arguments
  4. 如有必要,提供 # Examples 段,可以使用 Julia 文档测试
  5. 提供指向其他函数的引用
"""
bar(x[, y])

Compute the Bar index between `x` and `y`.

If `y` is unspecified, compute the Bar index between all pairs of columns of `x`.

## Examples
`julia-repl
julia> bar([1, 2], [1, 2])
1
`
See also [`bar!`](@ref), [`baz`](@ref), [`baaz`](@ref).
"""
function bar(x, y) ...

参考文献