0
我在伊德里斯面臨一個問題,在那裏我想創建一個基於可判斷財產的類型級別「檢查」,如果屬性持有我得到我想要的類型,但如果屬性失敗,我得到Unit
(()
),表明程序處於不一致狀態(如果我決定將它用作我的原始類型,則不應編譯)。伊德里斯 - 基於可判斷財產的類型計算不typecheck
下面是一個例子:
TestType : {k : Nat} -> Nat -> Vect k Nat -> Type
TestType n ls with (isElem n ls)
TestType n ls | Yes _ = Nat
TestType n ls | No _ =()
mkTestTypeFromNat : (n : Nat) -> (ls : Vect k Nat) -> Elem n ls -> Nat -> TestType {k=k} n ls
mkTestTypeFromNat n ls prf res = res
mkTestTypeFromUnit : (n : Nat) -> (ls : Vect k Nat) -> Not (Elem n ls) -> TestType {k=k} n ls
mkTestTypeFromUnit n ls prf =()
當我嘗試編譯此,它讓我看到以下錯誤:
When checking right hand side of mkTestTypeFromNat:
Type mismatch between
Nat (Type of n)
and
with block in Extensible_Records.TestType n
k
ls
(isElem n ls) (Expected type)
When checking right hand side of mkTestTypeFromUnit:
Type mismatch between
() (Type of())
and
with block in Extensible_Records.TestType n
k
ls
(isElem n ls) (Expected type)
在每一種mkTestTypeFrom_
功能我提供deciable財產證明,要麼是元素在列表中的證明,要麼是證明它不是。 typechecker不應該認識到它有這些證明,並且能夠毫無問題地計算with (isElem n ls)
節,並在每種情況下給我正確的類型?或者我錯過了什麼來說服這樣的類型分析者?