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

时间:2018-07-19 12:04:35

标签: implicit idris gadt

以下是带有三个数据构造函数的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是一个隐式参数?

1 个答案:

答案 0 :(得分:2)

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

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

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

  2. 它受第一行的a约束。

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