我写了一个 Agda 函数prefixApp
,它将向量函数应用于向量的前缀:
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
向量异或函数在哪里)
不幸的是,我不知道如何编写一个postfixApp
可以在不显式提供长度参数的情况下使用的函数。到目前为止,我的函数定义如下所示:
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
-function?