什么是依赖类型?

April 7, 2013

如果一个类型以类型作为参数,我们称之为参数化类型。例如Java中,List<Int>中有类型参数Int,表明这是一个包含整数的列表。

如果一个类型以值作为参数,我们就称之为依赖类型 ,例如我们可以用List<9>表示一个长度为9的列表(当然Java是不支持的)。

参数化类型不也依赖于其他类型吗,为什么不叫依赖类型?没办法,就这么叫的。

也许你还会问这和length域为9的List对象有分别?区别就在于List<9>是个类型,可以由编译器检查。假设一个函数只接受长度为9的列表,如果使用List,你就要在函数里检查length是不是⑨。如果有依赖类型,你可以把函数声明为void f(List<9> list),这样编译器就能检查你有没有正确使用这个函数,如果传进去的参数的类型不是List<9>,编译器就会报错,你不需要自己判断。

也许你会想动态语言要在运行时检查类型,那依赖类型的静态检测不就没意义了?静态类型检测对动态语言也是有用的。例如TypeScript为javascript做静态类型检测,然后生成javascript,这样就可以提前发现一些低级错误,不是很好吗?

忽略实践的困难,依赖类型还是很美好的东西,嗯,要忽略实践的困难。