[英]Agda type error
我是Agda的新手,我嘗試定義以下類型的常量prod
: Z → (Z → ((Z → Set) → Set))
現在,我編寫了以下Agda代碼:
data Prod (X : Set) : ℕ → X where
prod : ℕ → (ℕ → ((ℕ → X) → X))
當我進行類型檢查時,agda會產生以下錯誤消息:
X != Set (_33 X_) of type Set
when checking the definition of Prod
任何幫助都受到高度贊賞
您的數據類型定義有兩個問題。 首先,所有數據類型都在Set
(一定級別),您不能隨便聲明數據類型為其他類型的元素。
data T : ℕ where
該定義試圖假定自然數中還有另一個元素,即T
那沒有多大意義。 可以添加更多元素的唯一可能的“類型”是Set
所有(小型)類型的類型。 (我掩蓋了Set
的層次結構是無限的這一事實,您現在不需要處理它了)。
所以這沒關系:
data T : Set where
定義的第二個問題是prod
構造函數的類型不能反映它確實構造了Prod
類型的東西。 構造函數的要點是它們可以是您正在定義的類型的元素。
讓我們看一下自然數的定義:
data ℕ : Set where
zero : ℕ
suc : ℕ → ℕ
當我們寫zero : ℕ
,我們說zero
是自然數。 如果我們改用這個怎么辦:
data ℕ : Set where
zero : String
suc : ℕ → ℕ
我們正在定義自然數,並且將zero
定義為String
? 因此,由於我們正在定義構造函數,因此我們給它的類型必須提及我們在最后位置定義的類型。 (此提及也可以是間接的)。
Op₂ : Set → Set
Op₂ A = A → A → A
data Tree (A : Set) : Set where
nil : Tree A
node : A → Op₂ (Tree A)
您可以在冒號左側添加參數 ,而不能在構造函數中更改這些參數。 因此,例如,這是無效的:
data T (A : Set) : Set where
t : T ℕ
注意,僅T
是不夠的-它不是類型,而是諸如從類型到類型的函數之類的東西(即Set → Set
)。 這是可以的:
data T (A : Set) : Set where
t : T A
冒號的右邊是索引 。 這些類似於參數,只是您可以在構造函數中選擇值。 例如,如果我們有一個按自然數索引的數據類型,例如:
data T : ℕ → Set where
您可以使用類似以下的構造函數:
data T : ℕ → Set where
t₀ : T zero
t₁ : T (suc zero)
就像上面一樣, T
本身不是一種類型。 在這種情況下,這是ℕ → Set
的功能。
無論如何,回到您的代碼。 如果您要表示Prod
包含一個類型為ℕ → (ℕ → ((ℕ → X) → X))
函數,則它應為:
data Prod (X : Set) : ℕ → Set where
prod : (ℕ → (ℕ → ((ℕ → X) → X))) → Prod X zero
但是,我不知道您對索引的意圖是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.