簡體   English   中英

Agda類型錯誤

[英]Agda type error

我是Agda的新手,我嘗試定義以下類型的常量prodZ → (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM