遅延コンストラクタなしでCoList
を定義しようとしています。私はwith式を使用する問題に遭遇していますが、agdaはサブケースのタイプを洗練しません。式が評価されない
module Failing where
open import Data.Unit
open import Data.Empty
open import Data.Maybe
open import Data.Nat
open import Data.Vec hiding (head ; tail ; map ; take)
record CoList (A : Set) : Set where
coinductive
field
head : Maybe A
tail : maybe (λ _ → ⊤) ⊥ head -> CoList A
open CoList
nil : ∀ {A} -> CoList A
head nil = nothing
tail nil()
cons : ∀ {A} -> A -> CoList A -> CoList A
head (cons x xs) = just x
tail (cons x xs) tt = xs
take : ∀ {A} -> CoList A -> (n : ℕ) -> Maybe (Vec A n)
take l zero = just []
take l (suc n) with head l
... | nothing = nothing
... | just x = map (λ xs → x ∷ xs) (take (tail l {!!}) n)
その穴のタイプはmaybe (λ _ → ⊤) ⊥ (head l)
ですが、理由式での私はタイプが⊤
ことを期待します。私はhead l
とその場合はhead l = just x
でうんざりしているので、これを期待しています。私はtt
agdaモードで全体を埋めるためにしようと私に次のエラーを与える:
⊤ !=< (maybe (λ _ → ⊤) ⊥ (head l)) of type Set
when checking that the expression tt has type
(maybe (λ _ → ⊤) ⊥ (head l))
私は、以下の質問に答え、今、私は好奇心遅延コンストラクタなしでこのリストをエンコードするための良い方法はありますか?