Idris 中一流类型的概念

Concept of First-Classed Type in Idris

当通过 Edwin 的 Type-driven Development with Idris 学习 Idris 时,我了解到 Idris 的独特之处 属性,它的类型是第一个 class构造,与其他编程语言相比,尤其是那些也有依赖类型系统的语言。

书中谈到了这种特性的潜在用途:数据库模式、网络协议描述等

有了这些好处,我的问题有两个:

  1. 难道不能用一种没有 first-class 类型的依赖类型的语言来完成这些任务吗?
  2. 这种功能的缺点是什么?为什么其他 systems/languages 中的类型不是第一个 class (例如在 Agda 或 Coq 中)?我认为此功能对程序在编译时可以检查的内容引入了一些理论上的限制,但我不知道它是什么。

或更具体地说:

第一个class类型可以与单纯的依赖类型区分开来的例子有哪些?

我希望同时看到一些积极的例子(好处)和一些消极的例子(它使编译器难以做某事,或其他一些限制)。

"First-class type"在Idris书中的意思就是Agda或Coq意义上的"依赖类型",所以这里完全没有区别。

GADTs in Haskell and OCaml 可以被视为依赖类型的一种形式,它 而不是 包含 Idris 意义上的 first-class 类型。这里,有两种不同的编程语言,value-level和type-level编程,类型和值不能随意混用。 GADT 允许依赖模式匹配,在不同的分支中我们可以了解有关 type-level 值的信息。但是我们无法了解有关运行时值的信息。