私は自由を取ってデータ型の名前を変更します。データ型で
data ListI : Set → Set₁ where
[] : {A : Set} → ListI A
_∷_ : {A : Set} → A → ListI A → ListI A
data ListP (A : Set) : Set where
[] : ListP A
_∷_ : A → ListP A → ListP A
パラメータはコロンの前に行くと、 コロンの後に引数が呼び出されます。 はSet
にインデックス化され、最初のListI
と呼ばれる、第二ListP
、 は、パラメータとしてSet
を持っていますインディーズ。コンストラクタは同じ 方法で使用することができ、あなたは暗黙のセットに適用することができます
nilI : {A : Set} → ListI A
nilI {A} = [] {A}
nilP : {A : Set} → ListP A
nilP {A} = [] {A}
あり違いをするときパターンマッチングいます。我々が持っているインデックス付きのバージョンの場合:
null : {A : Set} → ListI A → Bool
null ([] {A}) = true
null (_∷_ {A} _ _) = false
これはListP
のために実行することはできません。
-- does not work
null′ : {A : Set} → ListP A → Bool
null′ ([] {A}) = true
null′ (_∷_ {A} _ _) = false
エラーメッセージが
The constructor [] expects 0 arguments, but has been given 1
when checking that the pattern [] {A} has type ListP A
ListP
も同様に、ダミーモジュールで定義することができていますListD
:
module Dummy (A : Set) where
data ListD : Set where
[] : ListD
_∷_ : A → ListD → ListD
open Dummy public
おそらく少し驚くべきことに、ListD
はListP
に等しいです。私たちは、Dummy
への引数のパターン と一致することはできません:
-- does not work
null″ : {A : Set} → ListD A → Bool
null″ ([] {A}) = true
null″ (_∷_ {A} _ _) = false
これはListP
と同じエラーメッセージを表示します。
ListP
は、誘導の家族である、単純 よりListI
をパラメータ化されたデータ型の例である:それは些細な方法で、この例ではあるが、 なインデックスに「依存します」。
データ型は
the wiki上に定義されているパラメータ化
、 と hereが小さく導入です。
誘導家族は本当に定義されていますが、誘導 家族必要があるように見える何かの標準的な例でthe wiki での詳述されていない:型のインデックスを無視
data Term (Γ : Ctx) : Type → Set where
var : Var Γ τ → Term Γ τ
app : Term Γ (σ → τ) → Term Γ σ → Term Γ τ
lam : Term (Γ , σ) τ → Term Γ (σ → τ)
を、これの簡易版ではできませんでしたlam
コンストラクタのために と書かれているのはDummy
です。
もう一つの良い参照は1997年
ハッピーAgdaコーディングからピーターDybjerでInductive Families です!
あなたの答えをありがとう!私が知りたいことはまだあります(私の質問は少し曖昧かもしれませんが、私は恐れています)。タイプシステムの不一致を防ぐために 'List'を' Set→Set'と定義することはできません。 'List(A:Set):Set'を動作させるメカニズム?私には(ハスケルの背景から)、両方とも 'data List :: * - > *(...)'のようですが、一方は動作し、もう一方は動作しません。ありがとう! – Vitus
私はあなたがすでにその理由を述べていると思います。 Setを引数とするコンストラクタの不一致を避けるためにはSet1に属している必要があります。パラメトリックデータ型を使用すると、指標が1つ上のレベル「上位」になってしまうデータ型を記述できます。パラメトリックデータ型の条件が適切であるため「動作」します。一方で、ウィキのページに示されているように、誘導家族がどのように「安全」であるかといういくつかの論争があります。現在のコンセンサスは、派手なデータ型を変換できる小さくて信頼できるAgdaコードを持つことです。 – danr
それは私のためにそれをクリアする、ありがとう。ここにあなたの恩恵があります。 – Vitus