GADT 数据构造函数参数如何在 Idris 中工作?

How do GADT data constructor arguments work in Idris?

这是一个 GADT,其中包含三个定义列表视图的数据构造函数:

data SplitList : List a -> Type where
  SplitNil : SplitList []
  SplitOne : SplitList [x]
  SplitPair : (lefts : List a) -> (rights : List a) ->
              SplitList (lefts ++ rights)

不明白SplitOne[x]从哪里来的?在 SplitNil 中,它似乎只是一个常量值 (Nil),它被馈送到 SplitList,但在 SplitOne 中,x 不知何故是一个隐式参数?

我不是专家,但由于没有其他人回答:是的,第一行中的a也是如此:List a -> Type is short for {a : Type} -> List a -> Type

根据类型推断,x 必须具有类型 a,因此 [x] : List aSplitList [x] : Type。 我不确定的是是否

  1. 这个a是另一个隐式参数,因此完整的类型签名是SplitOne : {a : Type} -> {x : a} -> SplitList [x](如果是,它的名字真的是a吗?),或

  2. 它以某种方式受第一行的 a 约束。

但第一个对我来说更有意义。