以下是带有三个数据构造函数的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
是一个隐式参数?
答案 0 :(得分:2)
我不是专家,但是由于没有其他人在回答:是的,第一行List a -> Type
is short for {a : Type} -> List a -> Type
中的a
也是如此。
通过类型推断,x
必须具有类型a
,因此[x] : List a
和SplitList [x] : Type
。
我不确定是否
此a
是另一个隐式参数,因此完整类型签名为SplitOne : {a : Type} -> {x : a} -> SplitList [x]
(如果是,其名称真的是a
吗?),或者
它受第一行的a
约束。
但是第一个对我来说更有意义。