抽象机器一步redex的Haskell代码?

抽象机器一步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或
x->x


给定这样一个单步归约函数,如何编写给出输入项标准形式的多步归约函数?

通常,您希望单步归约函数具有类型
T->可能是T
。然后,对于redexes,返回一个
Just
,对于普通表单,返回
Nothing
。这遵循一个一般原则,即函数应将其计算的尽可能多的信息返回给调用方,这有助于减少程序中的重复计算

如果您的单步归约函数是
singleStepReduce::T->T
,那么当给定一个已经是正常形式的参数时,它有两个选择:

  • 返回参数。这需要调用者执行类似于
    x==singleStepReduce x
    isNF x
    的操作来确定参数是否在NF中;这是已经确定的信息
    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