在埃里克·利珀特(Eric Lippert)的文章中,匈牙利表示法是怎么回事?,他指出,匈牙利符号(一种好符号)的目的是为了
扩展“类型”的概念以涵盖除存储表示信息之外的语义信息。
一个简单的示例是,用x表示变量的前缀是x,用y表示变量的前缀是y,无论这些变量是整数还是浮点数或其他形式,这样当您不小心编写时xFoo + yBar
,代码显然看起来是错误的。
但是我也一直在阅读有关Haskell的类型系统的信息,似乎在Haskell中,可以使用编译器会为您检查的实际类型来完成同一件事(即“将类型的概念扩展为包含语义信息”)。因此,在上面的示例中,xFoo + yBar
如果正确设计程序,在Haskell中实际上将无法编译,因为它们将被声明为不兼容的类型。换句话说,Haskell的类型系统似乎有效地支持了相当于匈牙利表示法的编译时检查。
那么,匈牙利符号法是否只是一种编程语言的创可贴,其类型系统无法对语义信息进行编码?还是匈牙利记谱法提供的东西超出了Haskell的静态类型系统所能提供的东西?
(当然,我以Haskell为例。我确定还有其他语言具有类似表现力(丰富?强?)类型系统,尽管我还没有遇到过。)
明确地说,我不是在用数据类型注释变量名,而是在程序上下文中使用有关变量含义的信息。例如,变量可以是整数,浮点数,双精度或长整数等,但变量的含义可能是它是以英寸为单位的相对x坐标。这就是我所说的通过匈牙利表示法(和通过Haskell类型)编码的信息。