我寫一個阿格達功能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
是矢量XOR函數)
不幸的是,我不知道怎麼寫了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
功能?
順便說,可以寫'postfixApp {K = 2}'代替'postfixApp {_} {_} {_} {2}'。 – Vitus