试图弄清楚这个 haskell 代码的含义

Trying to figure out what this haskell code means

嘿,我是 haskell 的新手,我似乎不太明白这段代码中发生了什么

execCBN :: Program -> Exp
execCBN (Prog e) = evalCBN e

evalCBN :: Exp -> Exp
evalCBN (EApp e1 e2) = case (evalCBN e1) of
    (EAbs i e1') -> evalCBN (subst i e2 e1')
    e1' -> EApp e1' e2
evalCBN (EIf e1 e2 e3 e4) = if (evalCBN e1) == (evalCBN e2) then evalCBN e3 else evalCBN e4
evalCBN (ELet i e1 e2) = evalCBN (EApp (EAbs i e2) e1) 
evalCBN (ERec i e1 e2) = evalCBN (EApp (EAbs i e2) (EFix (EAbs i e1))

谢谢

要理解 Haskell 代码,通常要先看类型!您没有在此处包括它们,但它们可能看起来像这样:

newtype Program = Program Exp

data Exp
    = EApp Exp Exp
    | EAbs String Exp
    | EIf Exp Exp Exp Exp
    | ELet String Exp Exp
    | ERec String Exp Exp
    | EFix Exp
    | EVar String

我肯定在猜测 Exp 类型的一些细节!

现在,这是正在发生的事情。这为基于 lambda 演算的非常简单的编程语言定义了抽象语法树。 Exp 的每个构造函数都是语言中的某种语法结构:一个函数应用程序 (EApp)、一个 lambda (EAbs)、一个 if 语句 (EIf)、等等。 evalCBN 函数正在为该编程语言定义解释器或求值器。因为有许多不同的语法结构,evalCBN 是用 模式匹配 定义的,其中每种可能需要评估的语法节点都有不同的方程式。因为树结构是递归的,所以评价函数也是递归的。

据推测,名称 evalCBN 指的是它使用 "call by need" 策略进行评估,而不是 "call by value" 策略。您可以在应用函数的等式中看到:

evalCBN (EApp e1 e2) = case (evalCBN e1) of
    (EAbs i e1') -> evalCBN (subst i e2 e1')
    e1' -> EApp e1' e2

请注意参数 e2 根本没有计算。相反,它只是以未计算的形式代入表达式 e1'。按值变化调用将在替换之前评估 e2

ELetERec(非递归 let 和递归 let)的方程很有趣,因为它们所做的只是重写 ELetERec转换成不同的表达式,然后对其求值。这是所谓的 "syntactic sugar" 的一个很好的例子。这些句法形式不会使语言更具表现力;相反,它们在 "desugaring" 过程中被浅层重写为更基本的形式。

如果您还有其他问题,请提出更具体的问题。这段代码很多,所以我无法一一回答!