因此,在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,参见 这篇文章),上面的例子在 Haskell 中也是不可能的,因为与 Idris 不同,Haskell 不允许值泄漏到类型层次?