Questions tagged «type-checking»

验证变量,表达式或值是否具有声明的类型

8
计算机如何确定字节的数据类型?
例如,如果计算机已10111100存储在RAM的特定字节中,计算机如何知道将此字节解释为整数,ASCII字符或其他内容?类型数据是否存储在相邻字节中?(我认为情况并非如此,因为这将导致一个字节使用两倍的空间。) 我怀疑也许计算机甚至不知道数据类型,只有使用它的程序才知道。我的猜测是,由于RAM是R AM,因此不能按顺序读取,因此某个特定程序只是告诉CPU从特定地址获取信息,而该程序定义了如何处理它。这似乎适合编程,例如需要类型转换。 我在正确的轨道上吗?

2
类型检查算法
我正在开始有关类型检查算法的个人书目研究,并需要一些技巧。最常用的类型检查算法,策略和通用技术是什么? 我对以众所周知的强静态类型化语言(例如C ++,Java 5 +,Scala或其他语言)实现的复杂类型检查算法特别感兴趣。IE,由于基础语言的键入非常简单(例如Java 1.4及更低版本),因此类型检查算法不是很简单。 我本身对特定的语言X,Y或Z并不感兴趣。我对类型检查算法感兴趣,无论它们针对的是哪种语言。如果您提供诸如“您从未听说过的语言L是强类型且类型复杂的答案”,则可以使用类型检查算法,该算法通过使用算法Z检查X和Y来进行A,B和C运算,或者“用于Scala的策略X和Y以及用于C#的A的变体Z都很酷,因为R,S和T功能以这种方式起作用”,那么答案就很好。

1
产品类型的类型推断
我正在为连接语言开发编译器,并希望添加类型推断支持。我了解Hindley–Milner,但是我一直在学习类型理论,所以我不确定如何适应它。以下系统是否合理,可以推断? 术语是文字,术语的组合,术语的引用或基元。 e::=x∣∣ee∣∣[e]∣∣…e::=x|ee|[e]|… e ::= x \:\big|\: e\:e \:\big|\: [e] \:\big|\: \dots 所有术语表示功能。对于两个函数和,,即,并置表示反向组合。文字表示尼拉德功能。e 2 e 1e1e1e_1e2e2e_2e1e2=e2∘e1e1e2=e2∘e1e_1\:e_2 = e_2 \circ e_1 除组合以外的其他术语具有基本的类型规则: x:ι[Lit]Γ⊢e:σΓ⊢[e]:∀α.α→σ×α[Quot],α not free in Γx:ι[Lit]Γ⊢e:σΓ⊢[e]:∀α.α→σ×α[Quot],α not free in Γ \dfrac{}{x : \iota}\text{[Lit]} \\ \dfrac{\Gamma\vdash e : \sigma}{\Gamma\vdash [e] : \forall\alpha.\:\alpha\to\sigma\times\alpha}\text{[Quot]}, \alpha \text{ not free in } \Gamma 值得注意的是缺少应用规则,因为连接语言缺少它。 类型可以是文字,类型变量,也可以是堆栈之间的函数,其中堆栈被定义为右嵌套元组。相对于“堆栈其余部分”,所有函数都是隐式多态的。 …

2
拥有运行托管代码的最小内核的潜在陷阱是什么?
假设我要基于一个很小的本机较低层内核构建操作系统,该较低层本地内核充当托管代码解释器/运行时,并基于一个较大的较高层内核编译为非本地机器语言(Java字节码,CIL等)。类似操作系统的示例将是Singularity和Cosmos。 与纯本机解决方案相比,使用这种基础结构编写操作系统存在哪些陷阱和开发挑战?


1
我们为什么不对编译时间保证进行更多研究?
我喜欢所有的编译时间,我喜欢这样的想法:一旦您编译了程序,就可以保证程序的执行。一般来说,静态类型系统(Haskell,C ++等)似乎比任何动态类型系统都提供了更强大的编译时保证。 据我了解,Ada在编译时间检查方面走得更远,并且能够在执行之前检测到更大范围的错误。考虑到在某个时间点,它被选用于脆弱的领域(编程错误可能会导致人员伤亡),因此它也被认为是相当安全的。 现在,我想知道:如果更强大的静态保证导致代码更完整,更安全,那么我们为什么不朝这个方向进行更多研究呢? 一种似乎缺少的东西的例子是一种语言,它不是定义int具有由基础体系结构的位数确定的范围的通用类型,而是可以具有范围(在下面的示例中Int [a..b]描述了一个介于包括a和b): a : Int [1..24] b : Int [1..12] a + b : Int [2..36] a - b : Int [-11..23] b - a : Int [-23..11] 或(从Ada那里获得): a : Int [mod 24] b : Int [mod 24] a + b : Int [mod 24] …

2
将HoTT中的产品简化为教堂/斯科特编码
因此,我目前正在与某些人一起阅读HoTT书。我声称,通过将递归的类型作为等效类型的灵感,我们将看到的大多数归纳类型都可以简化为仅包含依赖函数类型和Universe的类型。我开始勾勒出我认为这将如何工作的草图,经过一番绊脚石,我得出了我认为是答案的答案。 (⋅ ,⋅ )≡ λ 一个:甲。λ b :乙。λ Ç :ü。λ 克:甲→ 乙→ Ç 。g (a )(b )i n d⋅ × ⋅ ≡ ΠA ,B ,C:U(A → B → C)→ C⋅×⋅≡∏A,B,C:U(A→B→C)→C\cdot \times \cdot \equiv \prod_{A, B, C : \mathcal{U}} (A \to B \to C) \to C (⋅ ,⋅ )≡ λ 一个:甲。λ …

1
ML类型推断的指数成本的简洁示例
引起我注意的是,像OCaml这样的功能语言中类型推断的成本可能很高。该主张是有一系列表达式,使得对于每个表达式,相应类型的长度在表达式的长度上是指数的。 我设计了以下顺序。我的问题是:您是否知道一个具有更简洁表达式的序列,可以实现相同的类型? # fun a -> a;; - : 'a -> 'a = <fun> # fun b a -> b a;; - : ('a -> 'b) -> 'a -> 'b = <fun> # fun c b a -> c b (b a);; - : (('a -> 'b) -> 'b -> …

1
为什么Coq会在其核心语言中包含let表达式
Coq在其核心语言中包含let表达式。我们可以这样将let表达式转换为应用程序: let x : t = v in b ~> (\(x:t). b) v 我知道这并不总是可行,因为v在进行typechecking时该值不可用b。但是,可以通过特殊外壳对表单应用程序进行类型检查来轻松解决此问题(\(x:t). b) v。这使我们可以在进行类型检查时以特殊情况为代价删除let表达式。为什么Coq include仍然包含let表达式?它们是否还有其他优点(除了不需要特殊情况)?

1
静态类型检查过于保守的无人为例是什么?
在程序设计语言的概念,约翰米切尔写道,静态类型检查是必要的保守(过于严格的),因为停机问题。他举了一个例子: if (complicated-expression-that-could-run-forever) then (expression-with-type-error) else (expression-with-type-error) 有人可以提供一个确实会引起实际关注的非故意答案吗? 我了解到Java允许针对以下情况进行动态检查的类型转换: if (foo instanceof Person) { Person p = (Person) foo; : } 但我认为这是Java语言/编译器缺陷的必要,而不是跨语言问题。
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.