试图弄清楚这个 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
。
ELet
和 ERec
(非递归 let 和递归 let)的方程很有趣,因为它们所做的只是重写 ELet
或 ERec
转换成不同的表达式,然后对其求值。这是所谓的 "syntactic sugar" 的一个很好的例子。这些句法形式不会使语言更具表现力;相反,它们在 "desugaring" 过程中被浅层重写为更基本的形式。
如果您还有其他问题,请提出更具体的问题。这段代码很多,所以我无法一一回答!
嘿,我是 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
。
ELet
和 ERec
(非递归 let 和递归 let)的方程很有趣,因为它们所做的只是重写 ELet
或 ERec
转换成不同的表达式,然后对其求值。这是所谓的 "syntactic sugar" 的一个很好的例子。这些句法形式不会使语言更具表现力;相反,它们在 "desugaring" 过程中被浅层重写为更基本的形式。
如果您还有其他问题,请提出更具体的问题。这段代码很多,所以我无法一一回答!