【发布时间】:2016-09-18 15:25:52
【问题描述】:
因此,在 Idris 中,编写以下内容是完全有效的。
item : (b : Bool) -> if b then Nat else List Nat
item True = 42
item False = [1,2,3] // cf. https://www.youtube.com/watch?v=AWeT_G04a0A
没有类型签名,这看起来像是一种动态类型的语言。但是,事实上,Idris 是依赖类型的。 item b 的具体类型只能在运行时确定。
这当然是 Haskell 程序员的谈话:Idris 意义上的item b 类型是在编译时给出的,它是if b then Nat ...。
现在我的问题是:我是否正确得出结论,在 Haskell 中,运行时和编译时之间的边界恰好在值世界(False、“foo”、3)和类型世界(Bool、String、 Integer) 而在 Idris 中,运行时和编译时之间的边界跨越了宇宙?
另外,我是否正确假设即使在 Haskell 中使用依赖类型(使用 DataKinds 和 TypeFamilies,参见 this article),上述示例在 Haskell 中也是不可能的,因为与 Idris 相反的 Haskell 不允许值泄漏到类型级别?
【问题讨论】:
-
好问题!我会将您的注意力转移到@pigworker 的this lecture 以补充他的答案
-
您能否创建一个 idris-Universe 主题/标签并使用它来代替用于多值数据库的 Universe。
-
@Mike "创建一个新标签至少需要 1500 声望......" 我猜,一个合适的标签应该是 "type-universes"。
标签: haskell dependent-type idris type-level-computation