Haskell代码为抽象机的一步重新索引?

时间:2016-08-31 14:09:35

标签: haskell functional-programming lambda-calculus

抽象机器的单步减少功能的类型应该是什么? x -> Maybe xx -> x

鉴于这样的单步减少函数,如何编写给出输入项的正常形式的多步减少函数?

1 个答案:

答案 0 :(得分:1)

通常,您希望单步缩减功能具有类型T -> Maybe T。然后,对于重新索引,您返回Just,对于普通表单,您返回Nothing。这遵循一般原则,即函数应尽可能多地将它们计算的信息返回给调用者,这有助于减少程序中的重新计算。

如果你的单步缩减函数是singleStepReduce :: T -> T,当给出一个已经处于正常形式的参数时,它有两个选择:

  • 返回论点。这要求调用者执行x == singleStepReduce xisNF x之类的操作来确定参数是否在NF中;这是信息singleStepReduce已经确定,所以这是浪费的计算;此外,x == singleStepReduce x计算成本非常高,而isNF x仍然重复确定允许减少规则和确定正常形式的规则不合规定,这违反了基本软件工程原理。
  • 返回undefined。这更糟糕;这意味着调用者无法从正常形式的案例中恢复,迫使调用者在调用isNF x之前使用singleStepReduce x,并留下isNF x和{{的定义的问题1}}实现未解决的重叠逻辑。

实现一个多步骤缩减器,只要你对减速器在缺少正常形式的条件下进入无限循环就可以了,那么非常简单:

singleStepReduce x