抽象机器一步redex的Haskell代码?
抽象机器的单步减速功能应该是什么类型<代码>x->可能是x或抽象机器一步redex的Haskell代码?,haskell,functional-programming,lambda-calculus,Haskell,Functional Programming,Lambda Calculus,抽象机器的单步减速功能应该是什么类型x->可能是x或x->x 给定这样一个单步归约函数,如何编写给出输入项标准形式的多步归约函数?通常,您希望单步归约函数具有类型T->可能是T。然后,对于redexes,返回一个Just,对于普通表单,返回Nothing。这遵循一个一般原则,即函数应将其计算的尽可能多的信息返回给调用方,这有助于减少程序中的重复计算 如果您的单步归约函数是singleStepReduce::T->T,那么当给定一个已经是正常形式的参数时,它有两个选择: 返回参数。这需要调用者执
x->x
给定这样一个单步归约函数,如何编写给出输入项标准形式的多步归约函数?通常,您希望单步归约函数具有类型
T->可能是T
。然后,对于redexes,返回一个Just
,对于普通表单,返回Nothing
。这遵循一个一般原则,即函数应将其计算的尽可能多的信息返回给调用方,这有助于减少程序中的重复计算
如果您的单步归约函数是singleStepReduce::T->T
,那么当给定一个已经是正常形式的参数时,它有两个选择:
- 返回参数。这需要调用者执行类似于
或x==singleStepReduce x
的操作来确定参数是否在NF中;这是已经确定的信息isNF x
,因此这是浪费的计算;此外,singleStepReduce
在计算上非常昂贵,而x==singleStepReduce x
仍然重复该确定,并允许简化规则和确定范式的规则失步,这违反了基本的软件工程原则isNF x
- 返回未定义的
。这更糟;这意味着调用者无法从正常形式的情况中恢复,迫使调用者在调用
之前使用singleStepReduce x
,并且使得isNF x
和isNF x
的定义实现重叠逻辑的问题没有得到解决singleStepReduce x
multiStepReduce :: (a -> Maybe a) -> a
multiStepReduce r x = case r x of
Nothing -> x
Just y -> multiStepReduce r y
什么是
x
?什么抽象机器?一步该怎么做?可能这两种类型都可以,其中的可能只在返回值中混合了信号终止。假设x
是状态的类型,您还需要一个y
类型的参数,这会导致您移动到不同的状态。这将减少函数。当应用于术语时,给出在抽象机器执行一步后获得的术语。假设x是一种数据类型,用于表示算术和布尔表达式语言的术语。作为用户,我更喜欢步进函数的x->Maybe x
。函数X->X
不会告诉我术语是正常形式还是在自身上循环。更糟糕的是,X==singleStepReduce X
在X
具有自循环转换时并不等同于isNF X
。