簡體   English   中英

如何修復AGDA中不完整的模式匹配

[英]How to fix incomplete pattern matching in agda

這是來自自定義agda庫的代碼。 在以下代碼中,𝕍代表矢量,and代表自然數。 take𝕍類型類似於Haskell。 示例:“取3 [1,2,3,4,5,6,7,8]”結果為[1,2,3]。

take𝕍 : ∀{A : Set}{n : ℕ} → (m : ℕ) → 𝕍 A n → 𝕍 A m
take𝕍 0 xs = []
take𝕍 (suc m) (x :: xs) = x :: take𝕍 m xs

我不斷收到錯誤:

用於take𝕍的模式匹配不完整。 遺失案件:
take𝕍(suc m)[]檢查take𝕍的定義時

我不明白,我可能會錯過什么證據。

類型簽名take𝕍說,對於任何完全不受約束的m ,你可以返回Vec的長度mVec長度n 當然這不是正確的,因為m必須小於或等於n ,因為您要返回Vec的前綴。 並且由於要采用的許多元素和Vec的長度彼此無關,因此Agda會為您提供有關不完整模式匹配的錯誤。

在Agda標准庫中, m小於或等於輸入Vec的長度的限制表示為:

take : ∀ {a} {A : Set a} m {n} → Vec A (m + n) → Vec A m

您還可以定義類似

take : ∀ {a} {A : Set a} {m n} → m ≤ n → Vec A n → Vec A m

甚至

take : ∀ {a} {A : Set a} m {n} → Vec A n → Vec A (m ⊔ n)

來模擬Data.List.take的行為(其中_⊔_表示Agda stdlib中的min )。

您正在對m和類型為𝕍 A n的向量xs進行模式匹配。 由於m suc ,因此無法保證xs是非空的。 如錯誤所示,您還需要考慮msucxs為空的情況。

另外,您可以編寫一個具有更精確類型的函數,以保證xs至少與m一樣長。 這是標准庫中使用的:

take : ∀ {A : Set} m {n} → Vec A (m + n) → Vec A m

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM