Questions tagged «type-systems»

类型系统是一组规则的集合,这些规则将称为类型的属性分配给计算机程序所组成的各种结构(例如变量,表达式,函数或模块)。

9
动态类型语言是否值得所有批评?[关闭]
我已经在Internet上阅读了几篇有关企业中编程语言选择的文章。最近,许多动态类型的语言已经流行,例如Ruby,Python,PHP和Erlang。但是许多企业仍然使用静态类型的语言,例如C,C ++,C#和Java。 是的,静态类型语言的好处之一是可以在编译时而不是运行时更早地发现编程错误。但是动态类型语言也有优势。(更多关于维基百科) 企业之所以开始不使用Erlang,Ruby和Python之类的语言的主要原因,似乎是因为它们是动态类型的。这似乎也是StackOverflow上的人决定反对Erlang的主要原因。请参阅您为什么决定“反对” Erlang。 但是,对于企业中的动态类型,似乎存在强烈的批评,但是我真的不明白为什么它如此强大。 真的,为什么在企业中对动态类型的批评如此之多?它对项目成本的影响真的很大吗?但是也许我错了。

8
如果C允许,为什么Java完全不允许数字条件,如if(5){…}?
我有两个小程序: C #include <stdio.h> int main() { if (5) { printf("true\n"); } else { printf("false\n"); } return 0; } 爪哇 class type_system { public static void main(String args[]) { if (5) { System.out.println("true"); } else { System.out.println("false"); } } } 报告错误消息: type_system.java:4: error: incompatible types: int cannot be converted to …
33 java  c  type-systems 

7
Haskell的类型系统是理解函数式编程的障碍吗?[关闭]
我正在研究Haskell,目的是理解函数式编程,并期望我将应用在其他语言(主要是Groovy,Python,JavaScript)中获得的见解。 我之所以选择Haskell,是因为我有一个印象,那就是它纯粹是功能性的,不会允许任何对状态的依赖。 我没有选择学习Haskell,因为我对导航一个非常严格的类型系统感兴趣。 我的问题是:强类型系统是否是一种极其纯净的功能语言的必要副产品,还是这与Haskell无关的设计选择?

9
是否只有在动态类型化语言(如Python)中才有可能的设计模式?
我读过一个相关的问题,在动态语言(如Python)中是否有不需要的设计模式?并记得Wikiquote.org上的这句话 动态类型的妙处在于它使您可以表达任何可计算的内容。而类型系统则不是-类型系统通常是可决定的,它们将您限制为一个子集。支持静态类型系统的人说:“很好,足够好;您要编写的所有有趣程序都将作为类型使用。” 但这很荒谬—一旦有了类型系统,您甚至都不知道那里有什么有趣的程序。 ---软件工程电台第140集:Gilad Bracha的Newspeak和可插拔类型 我想知道,是否有有用的设计模式或策略使用引号的表述“不能作为类型工作”?


6
类型推断的权衡是什么?
似乎所有新的编程语言,或者至少是流行的编程语言都使用类型推断。即使是Javascript,也可以通过各种实现(Acscript,Typescript等)获得类型和类型推断。对我来说看起来很棒,但我想知道是否需要权衡取舍,或者为什么要说Java或旧的好语言没有类型推断 在Go中声明变量而不指定其类型时(使用不带类型的var或:=语法)时,将从右侧的值推断出变量的类型。 D允许编写大型代码片段,而无需像动态语言那样重复指定类型。另一方面,静态推断可推导类型和其他代码属性,从而充分利用静态和动态环境。 Rust中的类型推断引擎非常聪明。它所做的不只是在初始化过程中查看r值的类型。它还看起来如何在以后使用变量来推断其类型。 Swift使用类型推断来得出适当的类型。通过类型推断,编译器只需检查您提供的值,即可在编译代码时自动推断出特定表达式的类型。

3
一个好的通用类型系统
人们普遍认为Java泛型在某些重要方面失败了。通配符和范围的组合导致了一些严重无法读取的代码。 但是,当我看其他语言时,似乎真的找不到程序员满意的通用类型系统。 如果我们将以下作为此类类型系统的设计目标: 总是产生易于阅读的类型声明 易于学习(无需复数协方差,逆方差等) 最大化编译时错误的数量 有没有正确的语言?如果我使用google,我唯一看到的就是对类型系统如何吸收X语言的抱怨。这种类型的复杂性是通用类型固有的吗?我们应该放弃在编译时尝试100%验证类型安全性的想法吗? 我的主要问题是,就这三个目标而言,哪种语言“做到最好”是最好的。我意识到这是主观的,但到目前为止,我什至找不到一种语言,并非所有程序员都同意通用类型系统是一团糟。 附录:如前所述,子类型/继承和泛型的结合才是造成复杂性的原因,所以我真的在寻找一种将两者结合起来并避免复杂性激增的语言。

8
例如,对于大型Web应用程序,在现实世界中使用“强”类型系统吗?
我知道这是一个非常广泛,模棱两可甚至是哲学上的问题。在某种程度上,问题中最重要的关键字-“强”类型系统-本身定义不正确。所以,让我尝试解释我的意思。 问题的总体背景 我们已经在Ruby on Rails中构建了一个非常大型的Web应用程序,并且总体上我们对我们的堆栈感到满意。如果需要的话,我们可以非常快速地发货-可以在90%的“业务”案例中使用,而不必担心10%的边缘案例。另一方面,借助代码审查和测试覆盖率,我们可以缓慢而谨慎地进行,并确保覆盖所有基础-再次,仅在需要进行更仔细检查和安全的情况下。 但是,随着团队的壮大,我开始感到不舒服,因为缺少直接放入我们堆栈中的“安全网”。 我们最近开始在Java上进行一些本机Android开发。我(愉快地)想起了编译/静态/强类型语言提供的安全性。 IDE本身会捕获错误拼写的变量,错误的数据类型,错误的函数调用以及许多琐碎的错误。全部是因为IDE可以挂接到编译器并验证程序“正确性”的某些方面。 是否需要更改功能签名?简单。编译器+ IDE可以帮助您发现所有调用站点。 是否需要确保始终处理某些异常?已检查的救援例外情况。 现在,尽管这些安全功能各有优点,但我也很清楚它们的缺点。更重要的是,在“繁重的” Java世界中。因此,代替Java,我开始研究人们近来开始使用的大量现代“强类型”语言。例如:Scala,Rust,Haskell等。我最感兴趣的是它们的类型系统和静态/编译时检查的功能。 现在,问题 如何在大型应用程序中使用这些功能强大的类型系统和静态/编译时功能? 例如,对于这些强大的功能,我将如何超越标准的“ hello world”介绍?使用富类型系统来建模业务域问题的模型吗?当您位于30,000 LOC +区域中时,类型系统会帮助还是阻碍?当您的系统与弱类型的外部环境交互时,这些类型的系统(和编译时检查)所提供的安全网会如何处理?通过JSON或XML API,各种数据存储,用户输入等。

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

6
将基本类型(如int)实现为类的注意事项是什么?
设计和implenting面向对象的编程语言时,在某些时候你必须做出有关实现基本类型的选择(例如int,float,double或等价物)类或其他什么东西。显然,C系列语言倾向于不将其定义为类(Java具有特殊的原始类型,C#将其实现为不可变的结构,等等)。 当基本类型实现为类时(在具有统一层次结构的类型系统中),我可以想到一个非常重要的优势:这些类型可以是根类型的适当Liskov子类型。因此,我们避免使用装箱/拆箱(显式或隐式),包装器类型,特殊方差规则,特殊行为等使语言复杂化。 当然,我可以部分理解语言设计者为什么要决定他们的工作方式:类实例往往会有一些空间开销(因为实例可能在其内存布局中包含vtable或其他元数据),因此原语/结构不需要拥有(如果语言不允许继承这些语言)。 空间效率(以及改善的空间局部性,尤其是在大型阵列中)是基本类型通常不是类的唯一原因吗? 我通常认为答案是肯定的,但是编译器具有转义分析算法,因此当实例(任何实例,不仅仅是基本类型)被证明是严格的时,它们可以推断出是否可以(有选择地)忽略空间开销本地。 以上是错误的,还是我还缺少其他东西?

4
类型系统:名义与结构,显式与隐式
我对标称系统和结构类型系统之间的差异感到困惑。有人可以解释他们的不同之处吗? 据我了解: 标称:类型兼容性基于类型名称。 结构:类型兼容性基于类型结构,例如,在C中,如果2个变量是具有不同名称但结构相同的结构类型,则它们的类型兼容。 现在讨论显式和隐式:为什么它不同于静态和动态类型?在静态类型中,类型是显式的,而在动态类型中,类型是隐式的。我对吗?

6
编译器静态类型检查“复杂”表达式时,常用的程序是什么?
注意:在标题中使用“复杂”时,是指该表达式具有许多运算符和操作数。表达式本身并不复杂。 我最近一直在研究一个简单的x86-64汇编程序。我已经完成了编译器的主要前端-词法分析器和解析器-现在可以生成程序的抽象语法树表示形式。由于我的语言将是静态类型的,因此我现在进入下一阶段:类型检查源代码。但是,我遇到了一个问题,而自己却无法合理解决。 考虑以下示例: 我的编译器的解析器已阅读以下代码行: int a = 1 + 2 - 3 * 4 - 5 并将其转换为以下AST: = / \ a(int) \ - / \ - 5 / \ + * / \ / \ 1 2 3 4 现在,它必须键入检查AST。首先检查=操作员的类型。首先检查操作员的左侧。可以看到该变量a被声明为整数。因此,它现在必须验证右侧表达式为整数。 我了解如果表达式只是一个值(例如1或),该怎么办'a'?但是,对于具有多个值和操作数的表达式(一个复杂的表达式)(例如上述表达式),该如何处理呢?为了正确确定表达式的值,似乎类型检查器实际上必须执行表达式本身并记录结果。但这显然似乎破坏了将编译和执行阶段分开的目的。 我想可以做到的唯一另一种方法是递归检查AST中每个子表达式的叶子,并验证所有叶子的类型都与期望的运算符类型匹配。因此,从=运算符开始,类型检查器将扫描左侧的所有AST并验证叶子都是整数。然后,它将对子表达式中的每个运算符重复此操作。 我曾尝试在《龙书》的副本中研究该主题,但似乎没有涉及太多细节,只是重申了我已经知道的内容。 当编译器对具有多个运算符和操作数的表达式进行类型检查时,通常使用的方法是什么?我上面提到的任何方法都使用吗?如果没有,那么方法是什么,它们将如何工作?

1
Hindley-Milner推理可以为Go语言工作吗?
我读过Hindley-Milner不适用于具有子类的类型系统,并且还有其他类型系统功能也不能很好地使用它。Go当前在:=运算符中只有非常有限的类型推断。但是Go并没有传统意义上的子类,只有看起来与Haskell的类型类非常相似的接口,可以很好地与Hindley-Milner推理配合使用。 那么,Hindley-Milner推理在原理上是否可以像对Haskell一样进行推论?还是Go具有其他打破它的功能?(另一方面,Haskell还具有某些与Hindly-Milner不兼容的功能,如果要使用这些功能,则必须手动键入程序的那些部分。)

1
为什么Haskell不具有类型级别的lambda抽象?
是否有一些理论上的原因(例如类型检查或类型推断变得不确定)或实际原因(太难于正确实现)? 目前,我们可以换东西到newtype像 newtype Pair a = Pair (a, a) 然后有 Pair :: * -> * 但是我们不能做这样的事情λ(a:*). (a,a)。 (有一些语言可以使用它们,例如Scala可以。)

2
类型检查和递归类型(在Haskell / Ocaml中编写Y组合器)
当在Haskell的上下文中解释Y组合器时,通常会注意到,由于Haskell的递归类型,因此直接实现不会在Haskell中进行类型检查。 例如,从Rosettacode: The obvious definition of the Y combinator in Haskell canot be used because it contains an infinite recursive type (a = a -> b). Defining a data type (Mu) allows this recursion to be broken. newtype Mu a = Roll { unroll :: Mu a -> a } …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.