array_utils API
array_utils 是包 Luna-Flow/luna-utils 中定义在 src/array_utils.mbt 的部分:十二个作用于 Array[T] 的函数。它们是包级函数而不是方法,因此其他包以 @luna-utils.arr_sum(xs) 的形式调用。trait AddMonoid 和 Num 来自 luna-generic。
求和
fn[A : @luna-generic.AddMonoid] arr_sum(Array[A]) -> A
fn[A : @luna-generic.Num + Compare] arr_abs_sum(Array[A]) -> A
fn[A : @luna-generic.AddMonoid] zero_arr(Int) -> Array[A]
arr_sum(arr) 从 zero() 开始,从左到右累加各元素。空数组的和是 zero()。
arr_abs_sum(arr) 以同样的方式累加各元素的绝对值。当 x < zero() 时 x 的绝对值为 -x,否则为 x。
zero_arr(n) 返回一个长度为 n、元素全为 zero() 的新数组。元素类型由期望类型决定,例如 let zeros : Array[Double] = zero_arr(3)。
最值
fn[T : Compare] arr_max(Array[T]) -> T
fn[T : Compare] arr_min(Array[T]) -> T
arr_max(arr) 和 arr_min(arr) 分别返回最大和最小的元素;若有多个元素比较相等,返回其中第一个。两者在数组为空时都会 panic。
顺序与查找
fn[T] reverse(Array[T]) -> Array[T]
fn[T] reverse_inplace(Array[T]) -> Unit
fn[T : Eq] find(Array[T], T) -> Int?
reverse(arr) 返回元素逆序排列的新数组,arr 本身保持不变。reverse_inplace(arr) 从两端向中间交换元素,原地反转 arr;空数组保持原样。
find(arr, value) 返回满足 arr[i] == value 的第一个下标 i,形式为 Some(i);若没有元素等于 value,则返回 None。
一致性检查
fn[T : Eq] same(Array[T]) -> Bool
fn[T : Eq] same_to(Array[T], T) -> Bool
fn[U, V : Eq] map_same(Array[U], (U) -> V) -> Bool
fn[U, V : Eq] map_same_to(Array[U], V, (U) -> V) -> Bool
| 函数 | 返回 true 的条件 | 空数组时 |
|---|---|---|
same(arr) | 每个元素都等于 arr[0] | panic |
same_to(arr, sample) | 每个元素都等于 sample | 返回 true |
map_same(arr, f) | 每个 f(x) 都等于 f(arr[0]) | panic |
map_same_to(arr, sample, f) | 每个 f(x) 都等于 sample | 返回 true |
检查在遇到第一个不同的元素时停止。map_same 和 map_same_to 会先构造映射后的数组,因此 f 对每个元素都会调用一次。