抽象机器的单步减少功能的类型应该是什么? x -> Maybe x
或x -> x
?
鉴于这样的单步减少函数,如何编写给出输入项的正常形式的多步减少函数?
答案 0 :(得分:1)
通常,您希望单步缩减功能具有类型T -> Maybe T
。然后,对于重新索引,您返回Just
,对于普通表单,您返回Nothing
。这遵循一般原则,即函数应尽可能多地将它们计算的信息返回给调用者,这有助于减少程序中的重新计算。
如果你的单步缩减函数是singleStepReduce :: T -> T
,当给出一个已经处于正常形式的参数时,它有两个选择:
x == singleStepReduce x
或isNF x
之类的操作来确定参数是否在NF中;这是信息singleStepReduce
已经确定,所以这是浪费的计算;此外,x == singleStepReduce x
计算成本非常高,而isNF x
仍然重复确定和允许减少规则和确定正常形式的规则不合规定,这违反了基本软件工程原理。undefined
。这更糟糕;这意味着调用者无法从正常形式的案例中恢复,迫使调用者在调用isNF x
之前使用singleStepReduce x
,并留下isNF x
和{{的定义的问题1}}实现未解决的重叠逻辑。实现一个多步骤缩减器,只要你对减速器在缺少正常形式的条件下进入无限循环就可以了,那么非常简单:
singleStepReduce x