1
我想看看如何分支到「安全類型」的代碼。例如,以下意味着僅在安全路徑上調用tail
- 即,如果輸入列表非空。將會有一個簡單的方法,當然,只是模式匹配的列表中,但這個想法是調和函數(null
)及其在右側使用的結果:模式結果不可見
data Void : Set where
data _==_ {A : Set} (x : A) : A -> Set where
refl : x == x
data Bool : Set where
True : Bool
False : Bool
data List (A : Set) : Set where
nil : List A
_::_ : A -> List A -> List A
null : forall {A} -> List A -> Bool
null nil = True
null (x :: xs) = False
non-null : forall {A} -> List A -> Set
non-null nil = Void
non-null (x :: xs) = (x :: xs) == (x :: xs)
tail : forall {A} -> (xs : List A) -> {p : non-null xs} -> List A
tail (_ :: xs) = xs
tail nil {p =()}
prove-non-null : forall {A} -> (xs : List A) -> (null xs == False) -> non-null xs
prove-non-null nil ()
prove-non-null (x :: xs) refl = refl
compileme : forall {A} -> List A -> List A
compileme xs with null xs
... | True = xs
... | False = tail xs {prove-non-null xs refl}
在最後一行agda抱怨refl
不能被證明是null xs == False
類型。爲什麼不能看到with-clause剛剛目睹null xs
是False
?
關於它的正確方法是什麼?如何從一個看起來不依賴的結果中「提取」依賴項,如Bool
類型不依賴於列表xs
,但在上下文中它是?
嗯,首先'非空'是爲了某種方式表達一個類型'(x :: xs)== ys',如果'ys'非空,但我減少了需求,這使得它看起來很傻。 –