prefixApp
ベクトル関数をベクトルのプレフィックスに適用する Agda関数を作成しました。
split : {A : Set}{m n : Nat} -> Vec A (n + m) -> (Vec A n) * (Vec A m)
split {_} {_} {zero} xs = ( [] , xs )
split {_} {_} {suc _} (x :: xs) with split xs
... | ( ys , zs ) = ( (x :: ys) , zs )
prefixApp : {A : Set}{n m k : Nat} -> (Vec A n -> Vec A m) -> Vec A (n + k) -> Vec A (m + k)
prefixApp f xs with split xs
... | ( ys , zs ) = f ys ++ zs
prefixApp
長さの引数を明示的に指定せずに使用できるという事実が気に入っています。
gate : Vec Bool 4 -> Vec Bool 3
gate = prefixApp xorV
( xorV : Vec Bool 2 -> Vec Bool 1
Vector-Xor-Function はどこにありますか)
postfixApp
残念ながら、長さの引数を明示的に指定せずに使用できる -functionの書き方がわかりません。これまでの私の関数定義は次のようになります。
postfixApp : {A : Set}{n m k : Nat} -> (Vec A n -> Vec A m) -> Vec A (k + n) -> Vec A (k + m)
postfixApp {_} {_} {_} {k} f xs with split {_} {_} {k} xs
... | ( ys , zs ) = ys ++ (f zs)
ただし、postfixApp
常に長さの引数が必要なようです。例えば
gate : Vec Bool 4 -> Vec Bool 3
gate = postfixApp {k = 2} xorV
postfixApp
この非対称性を解消する方法、つまり、明示的な長さ引数なしで機能する関数を作成する方法を知っている人はいますか? 私は別の機能が必要だと思いsplit
ますか?