Functional programming 向类型化环境添加变量/类型

Functional programming 向类型化环境添加变量/类型,functional-programming,inference,formal-languages,formal-semantics,Functional Programming,Inference,Formal Languages,Formal Semantics,我有一个环境,其中包含一组我已经遇到的令牌;当我看到一个新的令牌时,我想将该令牌添加到当前环境中。基本上,我想在我执行解析的环境中表达一个集合并集操作 类似于Γ'={Γ,x} 及 如果要删除变量“x”(从环境中删除x) Γ'=Γ-x如果x∈ Γ 写这两种形式主义的正确方法是什么。谢谢 基本上,您希望将环境实现为支持插入、删除和搜索的数据结构,并将该数据结构传递给解析器。我想象在您的解析器中,您将查看当前令牌,对环境进行适当的更新,然后在下一个令牌上递归调用解析器,然后在更新的环境中传递 使用哪种

我有一个环境,其中包含一组我已经遇到的令牌;当我看到一个新的令牌时,我想将该令牌添加到当前环境中。基本上,我想在我执行解析的环境中表达一个集合并集操作

类似于Γ'={Γ,x}

及 如果要删除变量“x”(从环境中删除x)

Γ'=Γ-x如果x∈ Γ


写这两种形式主义的正确方法是什么。谢谢

基本上,您希望将环境实现为支持插入、删除和搜索的数据结构,并将该数据结构传递给解析器。我想象在您的解析器中,您将查看当前令牌,对环境进行适当的更新,然后在下一个令牌上递归调用解析器,然后在更新的环境中传递

使用哪种特定的数据结构取决于您,二叉搜索树或其变体可以很好地使用,或者如果您不关心性能,您也可以使用Haskell的内置列表类型

编辑:要正式地写下这个过程,您可以借用类型规则以及它们的编写方式,下面是一个示例。例如,我们可以表示程序被
Γ成功解析⊢ 程序:OK
(我不确定您是否要在这里处理实际类型)。然后,要将令牌添加到环境中,您可以编写

    Γ,id ⊢ program:OK
-------------------------
  Γ ⊢ add id, program:OK
        Γ ⊢ program:OK
------------------------------
  Γ,id ⊢ remove id, program:OK
要删除令牌,可以编写

    Γ,id ⊢ program:OK
-------------------------
  Γ ⊢ add id, program:OK
        Γ ⊢ program:OK
------------------------------
  Γ,id ⊢ remove id, program:OK

我只对编写正式规则感兴趣,对实现不感兴趣。@AdityaKumar很抱歉,我看到了您的haskell标记,并假设这是一个关于实现的问题。你是想写类型规则还是类似的类型规则?是的,我想要类似的。但没有涉及到任何类型。那么如何指定
add
remove
的语义呢。我能描述一下它们的意思吗?@AdityaKumar它们是你的语言的一部分,如果你在解析C,它将是
Γ⊢ int foo,程序:OK
if
Γ,foo⊢ 程序:好的
,所以您可以描述它们。