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 a
和 SplitList [x] : Type
。
我不确定的是是否
这个a
是另一个隐式参数,因此完整的类型签名是SplitOne : {a : Type} -> {x : a} -> SplitList [x]
(如果是,它的名字真的是a
吗?),或
它以某种方式受第一行的 a
约束。
但第一个对我来说更有意义。
这是一个 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 a
和 SplitList [x] : Type
。
我不确定的是是否
这个
a
是另一个隐式参数,因此完整的类型签名是SplitOne : {a : Type} -> {x : a} -> SplitList [x]
(如果是,它的名字真的是a
吗?),或它以某种方式受第一行的
a
约束。
但第一个对我来说更有意义。