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

标签 implicit idris gadt

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

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] :列出 aSplitList [x] :键入。 我不确定的是是否

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

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

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

关于implicit - GADT 数据构造函数参数在 Idris 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51422257/

相关文章:

dependent-type - 依赖类型的功能不是全部的,但 idris 认为它​​是全部的

list - 如何在 Idris REPL 中创建空列表?

c# - 收到错误 "No best type found for implicitly-typed array"

Idris:强制向量和相等

Scala:在伴随对象中使用隐式

haskell - 当约束成立时,将没有约束的 GADT 转换为另一个有约束的 GADT

Haskell GADTs - 为黎曼几何制作类型安全的张量类型

haskell - 正确标记 AST

.net - 隐式运算符和 TypeConverters 是否等效?

mysql 隐式连接+子查询