Questions tagged «type-systems»

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

10
我们应该为所有事物定义类型吗?
最近,我遇到了代码可读性的问题。 我有一个执行操作的函数,并返回表示该操作ID的字符串以供将来参考(有点像Windows中的OpenFile返回句柄)。用户稍后将使用此ID来开始操作并监视其完成。 由于互操作性的考虑,该ID必须是随机字符串。这创建了一个签名非常不清楚的方法,如下所示: public string CreateNewThing() 这使得返回类型的意图不清楚。我想将此字符串包装为另一种类型,从而使其含义更清晰,如下所示: public OperationIdentifier CreateNewThing() 该类型将仅包含字符串,并且在使用此字符串时将使用该类型。 显然,这种操作方式的优点是类型安全性更高,意图更明确,但是它还会创建更多的代码,并且这些代码不是非常习惯。一方面,我喜欢增加的安全性,但同时也会造成很多混乱。 您是否出于安全原因将简单类型包装在类中是一种好习惯吗?
141 type-systems 



16
我应如何在变量中存储“未知”和“缺失”值,同时仍保留“未知”和“缺失”之间的差异?
将此视为“学术”问题。我一直想知道不时避免使用NULL,这是我无法提出令人满意的解决方案的一个示例。 假设我将测量值​​存储在有时无法测量(或丢失)的地方。我想将“空”值存储在变量中,同时避免使用NULL。其他时候,该值可能是未知的。因此,有了特定时间范围内的测量值,有关该时间段内测量值的查询可能会返回3种响应: 当时的实际测量值(例如,包括在内的任何数值0) “缺失” /“空”值(即已完成测量,并且已知该点为空)。 未知值(即,此时未进行任何测量。它可以为空,但也可以为任何其他值)。 重要说明: 假设您有一个get_measurement()返回“空”,“未知”和类型为“整数”的值的函数。具有数值意味着可以对返回值执行某些运算(乘法,除法...),但是如果对这些运算符使用NULL,则如果不捕获它们,则会使应用程序崩溃。 我希望能够编写代码,例如避免使用NULL检查(伪代码): >>> value = get_measurement() # returns `2` >>> print(value * 2) 4 >>> value = get_measurement() # returns `Empty()` >>> print(value * 2) Empty() >>> value = get_measurement() # returns `Unknown()` >>> print(value * 2) Unknown() 请注意,所有print语句均未引起异常(因为未使用NULL)。因此,空值和未知值将根据需要传播,并且可以将值实际上是“未知”还是“空”的检查推迟到真正需要之前(例如在某个地方存储/序列化值)。 旁注:我想避免使用NULL的原因主要是脑筋急转弯。如果我想完成工作,我不反对使用NULL,但是我发现避免使用NULL可以使代码在某些情况下更加健壮。

10
为什么主流的强静态OOP语言阻止继承基元?
为什么这样可以正常进行并且通常可以预期: abstract type Shape { abstract number Area(); } concrete type Triangle : Shape { concrete number Area() { //... } } ...虽然这还不行,但是没有人抱怨: concrete type Name : string { } concrete type Index : int { } concrete type Quantity : int { } 我的动机是最大限度地使用类型系统进行编译时正确性验证。 PS:是的,我已经读过这篇文章,并且包装是一个棘手的解决方法。

14
类型测试什么时候可以?
假设一种语言具有某种固有的类型安全性(例如,不是JavaScript): 给定一个接受a的方法SuperType,我们知道在大多数情况下,我们可能会倾向于执行类型测试以选择一个动作: public void DoSomethingTo(SuperType o) { if (o isa SubTypeA) { o.doSomethingA() } else { o.doSomethingB(); } } 通常,如果不是总是的话,我们应该在上创建一个可覆盖的方法SuperType并执行以下操作: public void DoSomethingTo(SuperType o) { o.doSomething(); } ...,其中每个子类型都有自己的doSomething()实现。然后,我们应用程序的其余部分可以适当地忽略给定的SuperType是a SubTypeA还是a SubTypeB。 精彩。 但是,我们仍然可以is a使用大多数(即使不是全部)类型安全语言进行类似操作。这表明可能需要显式类型测试。 那么,在什么情况下(如果有的话)我们应该还是必须执行显式类型测试? 原谅我心不在or或缺乏创造力。我知道我以前做过;但是,老实说,很久以前,我不记得自己做的是否好!在最近的记忆中,我认为我没有遇到过需要测试我的牛仔JavaScript之外的类型的需求。

5
具有Maybe类型而不是null的语言如何处理边缘条件?
埃里克·利珀特(Eric Lippert)在讨论为什么C#使用a null而不是Maybe<T>类型时提出了一个非常有趣的观点: 类型系统的一致性很重要;我们是否总能知道在任何情况下都不能将非空引用视为无效?在引用类型为非空字段的对象的构造函数中该怎么办?在这样的对象的终结器中,该对象被终结是因为应该填充引用的代码引发了异常,该怎么办?对于您而言,保证其安全性的类型系统很危险。 这有点大开眼界。这些概念引起了我的兴趣,并且我在编译器和类型系统上做了一些尝试,但我从未考虑过这种情况。具有Maybe类型而不是null的语言如何处理诸如初始化和错误恢复之类的极端情况,在这种情况下,据称保证的非null引用实际上并不处于有效状态?

3
什么是类型系统?
背景 我正在设计一种语言,作为辅助项目。我有一个工作正常的汇编器,静态分析器和虚拟机。由于我已经可以使用构建的基础结构来编译和运行非平凡的程序,因此我考虑在大学里做一个演讲。 在我的演讲中,我提到VM提供了一种类型系统,有人问“ 您的类型系统用于什么? ”。回答后,我被问这个问题的人嘲笑。 因此,即使我几乎肯定会因提出这个问题而声名狼藉,但我还是去找程序员。 我的理解 据我了解,类型系统用于提供有关程序中实体的附加信息层,以便运行时,编译器或任何其他机器知道如何处理其所操作的位字符串。它们还有助于维护合同-编译器(或代码分析器,运行时或任何其他程序)可以验证程序在任何给定的点上以程序员期望其操作的值运行。 类型也可以用于向那些人类程序员提供信息。例如,我找到以下声明: function sqrt(double n) -> double; 比这更有用 sqrt(n) 前者提供了大量信息:sqrt标识符是一个函数,以一个double作为输入,并产生另一个double作为输出。后者告诉您它可能是一个带有单个参数的函数。 我的答案 因此,在被问到“您的类型系统是干什么的?”之后 我回答如下: 类型系统是动态的(类型被分配给值,而不是分配给包含它们的变量),但是强大,没有令人惊讶的强制规则(您不能将字符串添加到整数,因为它们表示不兼容的类型,但是您可以将整数添加到浮点数) 。 VM使用类型系统来确保指令的操作数有效。可供程序员使用,以确保传递给其函数的参数有效(即类型正确)。 类型系统支持子类型化和多重继承(这两种功能均可供程序员使用),并且在对对象使用动态方法分配时会考虑类型-VM使用类型来检查针对给定类型实现的给定消息的功能是什么。 后续问题是“如何将类型分配给值?”。因此,我解释了所有值都装在框内,并有一个指向类型定义结构的指针,该结构提供有关类型名称,其响应的消息以及其继承的类型的信息。 在那之后,我被嘲笑了,我的回答被“那不是一个真正的类型系统”打断了。 所以-如果我所描述的不符合“真实类型系统”的条件,那会是什么?那个人对我提供的内容不能视为类型系统是正确的吗?

8
是否有理由在编程语言中使用底部类型?
底部类型是一种主要出现在数学类型理论中的构造。也称为空类型。它是没有值的类型,但是是所有类型的子类型。 如果函数的返回类型是底部类型,则表示它不返回。期。也许它永远循环,或者抛出异常。 在编程语言中使用这种奇怪的类型有什么意义?这种情况并不常见,但是它存在于某些环境中,例如Scala和Lisp。

8
类型系统的安全益处是什么?
在道格拉斯·克罗克福德(Douglas Crockford)的《JavaScript:The Good Parts》中,他在继承章节中提到: 经典继承的另一个好处是它包括类型系统的规范。这主要使程序员不必编写显式的转换操作,这是一件非常好的事情,因为在转换时,类型系统的安全性丧失了。 那么首先,安全到底是什么?防止数据损坏,黑客或系统故障等? 类型系统的安全益处是什么?是什么让类型系统与众不同,才能提供这些安全优势?

7
在PHP中类型转换变量,这样做的实际原因是什么?
正如我们大多数人所知道的,PHP具有弱类型。对于那些不喜欢的人,PHP.net说: PHP在变量声明中不需要(或不支持)显式类型定义。变量的类型由使用该变量的上下文确定。 喜欢它还是讨厌它,PHP会即时重新发布变量。因此,以下代码有效: $var = "10"; $value = 10 + $var; var_dump($value); // int(20) PHP还允许您显式转换变量,如下所示: $var = "10"; $value = 10 + $var; $value = (string)$value; var_dump($value); // string(2) "20" 太酷了……但是,对于我自己的一生,我无法想到这样做的实际原因。 我对支持Java的语言进行强类型输入没有问题。很好,我完全理解。另外,我知道-并充分了解- 函数参数中的类型提示的用处。 上面的引用解释了我类型转换的问题。如果PHP可以随意交换类型,即使您强制转换了类型,PHP也可以这样做。当您在操作中需要某种类型时,它可以即时执行。这使得以下内容有效: $var = "10"; $value = (int)$var; $value = $value . ' TaDa!'; var_dump($value); // string(8) "10 …


2
为什么(或为什么不这样)存在性类型在函数式编程中被认为是不好的做法?
我可以使用哪些技术来一致地重构代码,以消除对存在类型的依赖?通常,这些用于取消您不希望使用的类型的构造的资格,并允许在对给定类型有最少了解的情况下进行消耗(或者我的理解是这样)。 有没有人想出一种简单而一致的方法来消除对代码中这些内容的依赖,而这些代码仍然保留了一些好处?还是至少有任何一种滑入抽象的方式,使得它们可以删除而无需大量的代码改动来应对这种变更? 您可以在此处阅读有关存在性类型的更多信息(“如果您敢..”)。


6
为什么类型推断有用?
我阅读代码的方式比编写代码的方式要多,并且我假设大多数从事工业软件工作的程序员都这样做。我认为类型推断的优点是减少了冗长和编写的代码。但是另一方面,如果您更频繁地阅读代码,则可能需要可读的代码。 编译器推断类型;有旧的算法可以解决这个问题。但是真正的问题是,当我阅读代码时,程序员为什么要推断出变量的类型?只是阅读该类型的人,是否比思考那里的类型还快? 编辑:作为结论,我理解为什么它有用。但是在语言功能类别中,我发现它在带有操作符重载的存储桶中显示-在某些情况下很有用,但如果滥用则会影响可读性。

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.