tôi đã viết một Agda chức năng prefixApp
áp dụng một Vector-Function để một tiền tố của một vector:đối số chiều dài Tiềm ẩn trong chiều dài cố định-vector-chức năng trong 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
Tôi thích thực tế, rằng prefixApp
có thể được sử dụng mà không cung cấp một đối số chiều dài một cách rõ ràng, ví dụ
gate : Vec Bool 4 -> Vec Bool 3
gate = prefixApp xorV
(nơi xorV : Vec Bool 2 -> Vec Bool 1
là Vector-XOR-Function)
Thật không may, tôi không biết làm thế nào để viết một postfixApp
-function mà có thể được sử dụng mà không cung cấp một cách rõ ràng một cuộc tranh luận dài. định nghĩa hàm của tôi cho đến nay trông như thế này:
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)
Dường như, tuy nhiên, postfixApp
luôn cần một cuộc tranh luận dài. Ví dụ.
gate : Vec Bool 4 -> Vec Bool 3
gate = postfixApp {k = 2} xorV
Có ai biết, làm thế nào để loại bỏ đối xứng này, ví dụ: làm thế nào để viết một hàm postfixApp
mà hoạt động mà không một cuộc tranh cãi dài rõ ràng. Tôi đoán, tôi cần một số khác split
-chức năng?
Bằng cách này, bạn có thể viết 'postfixApp {k = 2} 'thay vì' postfixApp {_} {_} {_} {2} '. – Vitus