[英]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
的長度m
有Vec
長度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
是非空的。 如錯誤所示,您還需要考慮m
為suc
而xs
為空的情況。
另外,您可以編寫一個具有更精確類型的函數,以保證xs
至少與m
一樣長。 這是標准庫中使用的:
take : ∀ {A : Set} m {n} → Vec A (m + n) → Vec A m
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.