在Idris Tutorial中,用於過濾矢量的函數是基於相關對的。爲什麼基於相關對的過濾器?
filter : (a -> Bool) -> Vect n a -> (p ** Vect p a)
filter f [] = (_ ** [])
filter f (x :: xs) with (filter f xs)
| (_ ** xs') = if (f x) then (_ ** x :: xs') else (_ ** xs')
但是,爲什麼有必要把它放在依賴對而不是更直接的東西上?
filter' : (a -> Bool) -> Vect n a -> Vect p a
在這兩種情況下的p
類型必須確定,但我認爲替代上市p
兩倍的冗餘消除。
我天真地試圖實施filter'
失敗,所以我想知道是否有一個根本的原因,它不能實現?或者可以執行filter'
,或許filter
僅僅是一個糟糕的例子來展示Idris中的相關對?但是,如果是這種情況,那麼在哪些情況下依賴對是有用的?
謝謝!
我現在明白爲什麼'filter''不能,謝謝。但我不認爲它已經在這裏(或在郵件列表中)涵蓋了爲什麼原始定義不會與我的選擇相同。也就是說,爲什麼在原始定義中不存在隱含的「{p:Nat}」,允許調用者指定返回長度?我想你在最後一句話中已經談到了,但我不太明白,你能否詳細說明一下? –
當然,增加了一個更詳細的解釋,爲什麼你需要從屬配對。 –