Questions tagged «type-systems»

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

2
是否可以在Haskell中“将维度转换为类型”?
假设我想编写一个处理向量和矩阵的库。是否可以将维度烘焙为类型,以使不兼容的维度的操作在编译时产生错误? 例如,我希望点积的签名类似于 dotprod :: Num a, VecDim d => Vector a d -> Vector a d -> a 其中d类型包含单个整数值(代表这些Vector的维)。 我想可以通过为每个整数定义一个单独的类型并将其分组为一个名为的类型类来实现VecDim。是否有某种机制可以“生成”此类类型? 还是一些更好/更简单的方法来实现同一目标?

1
C ++ 11中auto关键字的动机和陷阱(?)
我最近想知道为什么auto在C ++ 11中选择了关键字来标记必须由编译器推断类型的变量,例如 auto x = 1; 以来 var 在其他编程语言(例如C#,Scala,JavaScript)中似乎更常见,并且 据我所知,autobreaks向后兼容的新语义(它很少使用,但在以前的C ++版本中具有不同的含义,请参见例如此处)。 我想问一下是否有一个特殊的原因选择auto(赞成var或其他任何关键字)。在C ++ 11标准发布之前是否有关于此问题的特定讨论? 另外,在使用C ++ 11编译器重新编译旧版C ++代码时,是否应该注意任何可能的不兼容性?

24
编程语言中有趣或独特的类型?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我们都看到过整数,浮点数,字符串和偶数十进制类型。您遇到过的最奇怪,独特或有用的类型有哪些?

1
使用唯一性类型实现安全的并行性
一段时间以来,我一直对唯一性类型感兴趣,以替代纯函数式语言中的monad。不幸的是,这是CS研究的一个深奥领域,有关具有唯一性类型的编程的在线资源非常少。 显而易见,如何将唯一性类型用于实现状态数据结构,例如引用(“框”)和数组,尽管这使我无法理解如何使用它们来实现其他常见的状态数据结构。 例如,可以实现唯一类型的锁定吗?可以使用唯一性类型在线程之间共享可变数据吗?是否可以使用唯一类型来构建同步原语(例如互斥体),或者是否需要传递消息?

10
为什么继承和多态性被广泛使用?
我越了解不同的编程范例(例如函数式编程),就越开始质疑OOP概念(如继承和多态性)的智慧。我最初在学校学习继承和多态性,当时,多态性似乎是编写允许轻松扩展的通用代码的绝妙方法。 但是面对鸭子类型(动态和静态)以及诸如高阶函数之类的功能特性,我已经开始将继承和多态性视为基于对象之间脆弱的一组关系施加了不必要的限制。多态性背后的一般想法是,您只需编写一次函数,以后便可以在不更改原始函数的情况下向程序中添加新功能-您要做的就是创建另一个实现必要方法的派生类。 但是,无论是使用动态语言(例如Python)还是使用静态语言(例如C ++),通过鸭子输入都可以轻松实现这一点。 例如,请考虑以下Python函数,后跟等效的静态C ++: def foo(obj): obj.doSomething() template <class Obj> void foo(Obj& obj) { obj.doSomething(); } 相当于OOP的类似于以下Java代码: public void foo(DoSomethingable obj) { obj.doSomething(); } 当然,主要区别在于Java版本需要先创建接口或继承层次结构,然后才能起作用。因此,Java版本涉及更多工作,并且灵活性较差。此外,我发现大多数现实世界中的继承层次结构都有些不稳定。我们都已经看到了人为的形状和动物的示例,但是在现实世界中,随着业务需求的变化和新功能的添加,很难真正完成任何工作,然后才能真正扩展子类,或者重新建模/重构层次结构以包含更多的基类或接口,以适应新的需求。使用鸭子类型,您无需担心要建模的任何事情-您只需要担心所需的功能。 但是,继承和多态性是如此流行,以至于我怀疑将它们称为可扩展性和代码重用的主要策略是否过于夸张。那么,为什么继承和多态性如此成功呢?我是否忽略了继承/多态性比鸭子类型具有的一些重要优势?

5
在C ++中为所有对象使用对象(而不是原始类型)是否有意义?
在我最近从事的项目中,我不得不使用很多看起来像这样的函数: static bool getGPS(double plane_latitude, double plane_longitude, double plane_altitude, double plane_roll, double plane_pitch, double plane_heading, double gimbal_roll, double gimbal_pitch, double gimbal_yaw, int target_x, int target_y, double zoom, int image_width_pixels, int image_height_pixels, double & Target_Latitude, double & Target_Longitude, double & Target_Height); 所以我想重构它看起来像这样: static GPSCoordinate getGPS(GPSCoordinate plane, Angle3D planeAngle, Angle3D gimbalAngle, PixelCoordinate …

9
哪些静态类型的语言支持函数返回值的交集类型?
初步说明: 经过几次修改后,这个问题才得以解决,因为我缺乏适当的术语来准确说明我要寻找的内容。然后,Sam Tobin-Hochstadt发表了一条评论,这使我确切地知道了这是什么:支持函数返回值的交集类型的编程语言。 既然问题已经重新提出,我已经决定通过(希望)更精确的方式重写它来改进它。因此,下面的某些答案和注释可能不再有意义,因为它们是指先前的编辑。(在这种情况下,请参阅问题的编辑历史记录。) 是否有支持功能返回值的交集类型的流行的静态和强类型编程语言(例如Haskell,通用Java,C#,F#等)?如果是这样,那又如何? (老实说,我真的很希望看到有人演示一种如何使用主流语言(例如C#或Java)来表示交集类型的方法。) 我将使用一些类似于C#的伪代码给出一个简短的示例,说明交集类型的外观: interface IX { … } interface IY { … } interface IB { … } class A : IX, IY { … } class B : IX, IY, IB { … } T fn() where T : IX, IY { return … ? …

2
高阶参数多态性有用吗?
我很确定每个人都熟悉以下形式的通用方法: T DoSomething<T>(T item) 此功能也称为参数多态(PP),特别是等级1 PP。 假设可以使用以下形式的函数对象来表示此方法: <T> : T -> T 即,<T>意味着需要一种类型的参数,以及T -> T装置,它需要类型的一个参数T并返回相同的类型的值。 那么以下将是2级PP函数: (<T> : T -> T) -> int 该函数本身不接受任何类型参数,但接受一个具有类型参数的函数。您可以迭代地继续进行此操作,使嵌套越来越深,PP等级越高。 在编程语言中,此功能确实很少见。默认情况下,甚至Haskell也不允许。 它有用吗?它可以描述很难用其他方式描述的行为吗? 此外,强制性意味着什么?(在这种情况下)

9
是否应该使用单元测试来测试枚举的值?
如果您有一个仅带有值的枚举(没有任何方法可以像Java中那样),并且此枚举是系统业务定义的一部分,那么应该为它编写单元测试吗? 我一直认为应该编写它们,即使它们看起来很简单而且很多余,但我认为应该在测试中明确编写与业务规范有关的内容,无论它是使用unit / integration / ui / etc编写的。测试或使用语言的类型系统作为测试方法。因为从业务的角度来看,枚举(例如Java中)必须具有的值不能使用类型系统进行测试,所以我认为应该为此进行单元测试。 这个问题是不是类似于这一个,因为它没有解决同样的问题我的。在该问题中,存在一个业务功能(savePeople),而该人员正在查询内部实现(forEach)。在那里,有一个中间业务层(该功能可节省人员),封装了语言构造(forEach)。这里的语言构造(枚举)是用于从业务角度指定行为的一种。 在这种情况下,实现细节与数据的“真实性质”相吻合,即:(在数学意义上)一组值。您可以说使用了一个不可变的集合,但是相同的值仍然应该在那里存在。如果使用数组,则必须执行相同的操作来测试业务逻辑。我认为这里的难题在于,语言结构与数据的性质非常吻合。我不确定我是否正确解释了自己

3
使用接口而不是一般约束类型的原因是什么
在支持通用类型参数(也称为类模板和参数多态性,尽管每个名称当然都带有不同含义)的面向对象的语言中,通常可以在类型参数上指定类型约束,以便将其约束从另一种类型。例如,这是C#中的语法: //for classes: class ExampleClass<T> where T : I1 { } //for methods: S ExampleMethod<S>(S value) where S : I2 { ... } 在那些接口所约束的类型上使用实际接口类型的原因是什么?例如,进行方法签名的原因是什么I2 ExampleMethod(I2 value)?

2
结构分型的(缺点)
我刚刚看过Daniel Spiewak的演讲,他谈到了结构化类型与Scala的ans Java 标称类型相比的优势。这种差异的一个示例是以下Java代码 public interface Foo { public int length(); } public interface Bar { public int length(); } Foo f = ...; Bar b = f; 当然不会编译哪个,因为Foo和之间的类型兼容性Bar由名称决定。 另一方面,结构类型系统可以声明两种类型相等或兼容,因此,除其他事项外,还可以进行检查的鸭子类型。 现在,我认为我确实了解结构类型系统的大多数优点,但是我想知道它是否不会从以下示例中使类型安全失效 class Foo { class Bar { /* ... */ } def takeBar(b: Bar) = { /* ... */ } …

1
为什么Haskell在没有单态性限制的情况下无法避免重复评估?
前几天,我刚学完了youahaskell,并且试图理解Haskell Wiki中描述的“单态限制” 。我想我了解MR如何防止重复评估,但是我看不出为什么用更直接的方法无法避免重复评估。 我想到的具体示例是Wiki使用的示例: f xs = (len,len) where len = genericLength xs 哪里genericLength是类型Num a => [b] -> a。 显然,genericLength xs只需计算一次即可求值(len,len),因为它是具有相同参数的相同函数。我们不需要f知道任何调用即可知道这一点。那么,为什么Haskell不能在不引入MR之类的规则的情况下进行此优化? 那个Wiki页面上的讨论告诉我,它与Num类型类而不是具体类型有关,但是即使这样,在编译时纯函数是否返回相同的值也不应该很明显- -并因此使用相同的Num具体类型-两次给相同的参数?

2
类型理论中的正确术语:类型,类型构造函数,种类/排序和值
在回答前一个问题时,围绕特定结构的正确术语展开了一场小型辩论。由于我没有找到一个清楚地解决这个问题的问题(除了this或that,那不是很正确的事情),因此我正在提出一个新的问题。 可疑的术语及其关系是:类型,类型构造函数,类型参数,种类或种类以及值。 我还检查了维基百科上的类型理论,但这也没有太多说明。 因此,为了获得良好的参考答案并检查我自己的理解: 这些东西如何正确定义? 这些东西之间有什么区别? 它们如何相互关联?

1
为什么需要更高的种类?
一些语言允许带有类型参数的类和函数(例如,List<T>其中T可能是任意类型)。例如,您可以具有以下功能: List<S> Function<S, T>(List<T> list) 但是,某些语言允许将此概念扩展到更高一级,从而使您可以使用带有签名的功能: K<S> Function<K<_>, S, T>(K<T> arg) 其中K<_>本身是List<_>带有类型参数的类型。这种“部分类型”被称为类型构造函数。 我的问题是,为什么需要这种能力?之类的类型是有意义的,List<T>因为所有类型List<T>几乎都完全相同,但是所有类型K<_>可以完全不同。你可以有一个Option<_>和List<_>具有完全没有常见的功能。

2
Haskell中是否删除了类型?
Haskell的“泛型函数”概念与常见的lisp有一些明显的相似之处-既没有Haskell的经验,也没有常见的lisp,在这里我可能是非常近似的。这意味着可以定义一种通用to_string工具来定义所有类型的字符串表示形式。当然,必须在特殊情况下定义to_string功能,但是有一个函数的签名为α → string。 是否像在OCaml中一样在Haskell中删除了类型?如果是,那么Haskell中“泛型函数”的实现与普通lisp的实现有何不同,后者在普通类型中是动态的,因此不会被擦除? 我了解实现细节是特定于编译器的,但是可能有许多或所有实现共有的规定。

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.