如果一个类型以类型作为参数,我们称之为参数化类型。例如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,这样就可以提前发现一些低级错误,不是很好吗?
忽略实践的困难,依赖类型还是很美好的东西,嗯,要忽略实践的困难。