子程序

badge

函数

some_func(x: T, y: U) -> V
some_func: (T, U) -> V

过程

some_proc!(x: T, y: U) => V
some_proc!: (T, U) => V

函数方法

方法类型不能用Self在外部指定

.some_method(self, x: T, y: U) => ()
# (Self, T, U) => () 拥有 self 的所有权
.some_method: (Ref(Self), T, U) => ()

过程方法(依赖)

在下文中,假设类型 T! 采用类型参数 N: Nat。要在外部指定它,请使用类型变量

K!: Nat -> Type
# ~> 表示应用前后类型参数的状态(此时self必须是变量引用)
K!(N).some_method!: (Ref!(K! N ~> N+X), X: Nat) => ()

注意,.some_method 的类型是 | N,X: Nat| (Ref!(K! N ~> N+X), {X}) => () 对于没有 ref! 的方法,即在应用后被剥夺所有权,不能使用类型参数转换(~>)

如果取得所有权,则如下所示

# 如果不使用N,可以用_省略
# .some_method!: |N, X: Nat| (T!(N), {X}) => T!(N+X)
.some_method!|N, X: Nat| (self: T!(N), X: Nat) => T!(N+X)

运算符

可以通过用 ` 括起来将其定义为普通函数

中性字母运算符,例如 andor 可以通过用 ` 括起来定义为中性运算符

and(x, y, z) = x and y and z
`_+_`(x: Foo, y: Foo) = x.a + y.a
`-_`(x: Foo) = Foo.new(-x.a)