Types 如何理解idrislang中List和Vect的类型声明和定义?

Types 如何理解idrislang中List和Vect的类型声明和定义?,types,programming-languages,idris,dependent-type,Types,Programming Languages,Idris,Dependent Type,其中有以下几行: data List a = Nil | (::) a (List a) data Vect : Nat -> Type -> Type where Nil : Vect Z a (::) : a -> Vect k a -> Vect (S k) a 我假设第1行是List的类型定义,其余的是Vect的类型声明。 我认为应该有声明和定义,所以我查看了 data List : (elem : Type) -> Type where

其中有以下几行:

data List a = Nil | (::) a (List a)

data Vect : Nat -> Type -> Type where
   Nil  : Vect Z a
   (::) : a -> Vect k a -> Vect (S k) a
我假设第1行是List的类型定义,其余的是Vect的类型声明。 我认为应该有声明和定义,所以我查看了

data List : (elem : Type) -> Type where
  Nil : List elem
  (::) : (x : elem) -> (xs : List elem) -> List elem
它与Vect的类型声明具有相似的模式,因此看起来很好。但是我在源代码中找不到
数据列表a=Nil(::)a(列表a)
。此外,我找不到Vect的类型定义

因此,我的困惑是:

  • 为什么在源代码中找不到
    数据列表a=Nil(::)a(列表a)
  • Vect的实际类型定义是什么
Idris中没有单独的“类型定义”和“类型声明”;这只是编写类型定义的两种方法。见:

Idris提供了两种用于定义数据类型的语法。第一种是Haskell风格的语法,它定义了一种规则的代数数据类型

第二种是更一般的数据类型,使用Agda或GADT风格的语法定义。此语法定义了由某些值参数化的数据类型(在
Vect
示例中,值类型为
Nat
,值类型为
type

GADT是由Haskell介绍的,阅读或搜索GADT可以为您提供关于第二种风格的更多解释


List
的GADT风格定义等同于
数据列表a=…
一,除了允许命名
elem
x
xs

为什么投票失败?