array_utils API
array_utils は、パッケージ Luna-Flow/luna-utils のうち src/array_utils.mbt で定義される部分で、Array[T] に対する 12 個の関数からなります。これらはメソッドではなくパッケージレベルの関数なので、他のパッケージからは @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 の絶対値は、x < zero() のとき -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 はすべての要素に対して 1 回ずつ呼ばれます。