Haskell 在表达操作语义时遇到符号问题

Haskell 在表达操作语义时遇到符号问题,haskell,functional-programming,Haskell,Functional Programming,我试图写一些推理规则,但我不能理解通常用来写它们的符号的含义 例如: 我为某个类型表达式编写了以下规则: class(r) ∈ t, \there_exists v ⊢ r ∈ type(v) ------------------------------------------------------------- Γ, m:n -> r ⊢ n:(Γ, r, {}) <- r class(r)∈ t、 \n存在着\v⊢ R∈ 类型(v) -----------------

我试图写一些推理规则,但我不能理解通常用来写它们的符号的含义

例如: 我为某个类型表达式编写了以下规则:

 class(r) ∈ t,  \there_exists v ⊢ r ∈ type(v)
-------------------------------------------------------------
 Γ, m:n -> r ⊢ n:(Γ, r, {}) <-  r
class(r)∈ t、 \n存在着\v⊢ R∈ 类型(v)
-------------------------------------------------------------

Γ,m:n->r⊢ n:(Γ,r,{})在高层次上,表示法很简单:假定行上方的条件保持不变,则行下方的表达式为真

Γ是一个类型上下文——也就是说,它是一组变量和类型对。这些对将变量映射到类型。这个⊢ 意思是“在上下文中”。冒号只是将一个变量与一个类型组合在一起——就像Haskell中的
,或者Scala或Ocaml中的
。比如说
Γ⊢ x:σ
表示“在上下文Γ中,x具有σ类型”。类似于
Γ,x:σ
的意思是由
Γ
x:σ
组成的上下文

本质上,上下文表示其他变量所具有的所有类型。So
x:σ∈ Γ
意味着
x
Γ
中具有类型
σ
,这让您可以轻松地解决
Γ⊢ x:σ
。这意味着,如果
x
绑定到上下文中的某个类型,则它在该上下文中具有该类型

您可以将类型上下文视为来自“外部”的所有类型信息。因此,上面一段中的简单陈述基本上告诉您,如果您看到
x
x
已经具有类型
σ
,您可以推断
x
具有类型
σ
。不是很有趣,但很重要

您可以将此规则写为:

x:σ ∈ Γ
-------
Γ ⊢ x:σ
要是我们有乳胶就好了。我想我们不如math.se或cstheory.se那么酷

下面是一个稍微复杂一点的例子。本质上,我们想要编码应用程序如何在简单类型的lambda演算中工作。它实际上非常简单:给定一个
f
类型为
τ的函数→ τ'
和类型
τ的值
x
,则
fx
具有类型
τ'
。在Haskell中,这看起来像是在
x::Int
上应用
f::Int->Bool
。很明显,
fx::Bool
。让我们把这个写下来

条件(顶部位)是,在某些上下文中,
f
具有类型
τ→ τ'
Γ⊢ f:τ→ τ'
。同样,在相同的上下文中,
x
具有类型
τ
Γ⊢ x:τ
。综合起来,我们得到:
Γ⊢ f:τ→ τ' Γ ⊢ x:τ

现在我们来看看最下面的部分。考虑到这两种类型,我们知道什么?我们知道应用程序的类型,但仅在相同的上下文中。(这就是为什么
Γ
很重要)所以我们得到:
Γ⊢ f x:τ'

现在,把所有这些放在一起,我们有:

Γ ⊢ f:τ → τ' Γ ⊢ x:τ 
--------------------
     Γ ⊢ f x:τ'
看到StackOverflow语法highlighter与最后一个示例的斗争是很有趣的。我想知道它认为是哪种语言。

这个
Γ
(如果有人知道如何嵌入LaTeX,请留下注释或编辑注释)是键入上下文的符号:您可以将其视为表达式与其类型之间的映射

例如,让我们看两个上下文:

  • Γ0
    空地图和
  • Γ1=Γ0,x:Int
    前一个文件中包含了类型信息,表示
    x
    具有类型
    Int
    。因此,
    这里代表类型分配
现在,在空上下文(
Γ0
)中,无法键入表达式
x+x
,因为您不知道
x
的类型(它不存储在地图中)。然而,在另一个上下文中,我们有一个
x
(即
Int
)的类型,因此我们可以说
x+x
具有类型
Int

在形式上,我们使用了如下规则:

  x : σ ∈ Γ
______________
 Γ ⊢ x + x: σ
注意,Haskell中的
代表
。和
A⊢ B
应理解为“在
A
B
保持的上下文中”


PS:我有一门关于类型系统的课程,你可以找到一些材料(你可以看看Typed_Lambda_calculation.pdf)。

你不能在StackOverflow帖子中嵌入LaTeX(据我所知).但是你可以用一个实际的字母。另外,我下学期要上一节课,我的教授将来自罗马尼亚。这只是一个有趣的巧合。我想他甚至上过与你联系的那所大学相同的大学:)。乔治·内库拉。我还没见过他,但他看起来真的很酷。酷。我听说过他一点,你会喜欢他的谢谢你的课堂讲稿。我喜欢下面的两个答案。我只想补充一下⊢ 这里有比您在这里讨论的类型化语言的特定操作语义更广泛的约定⊢ 就像一个逗号,用来分隔提供的内容和可以从中获取的内容。这里的集合通常使用希腊字母大写。您可能会看到用这些术语表示的逻辑的演绎系统。您也可能会看到一些这种表示法,用于给出无类型的操作语义,比如,在的lhs上使用small\rho⊢ 代表全球国家。