【发布时间】:2012-04-26 23:23:51
【问题描述】:
我有一个 Uni 项目,为一种简单的命令式语言编写编译器(在 Haskell 中)。其中一项要求是在进入函数调用、离开函数和分配变量时打印调试语句。
输入函数时打印消息很容易,我只是使用Debug.trace,例如:
functionValue = trace "Entering function" (evaluateFunction functionArguments)
分配给变量时也适用相同的过程。我想不通的是如何在从函数调用返回时打印并使输出与其他输出正确计时。到目前为止,我所做的每一次尝试都导致在“输入函数”之后立即打印“离开函数” - 我需要在打印“离开函数”之前打印函数的内部调试语句(分配和嵌套函数调用)。
我的命令式习惯告诉我,我需要一种在离开函数输出之前强制执行 (evaluateFunction functionArguments) 的方法,但这在 Haskell 中似乎是不可能且错误的。
我现在得到的示例输出:
Entering main function...
Leaving main function...
Entering fn1 function...
Leaving fn1 function...
Assigning value1 to A.
Assigning value2 to C.
Entering fn2 function...
Leaving fn2 function...
Assigning value3 to B.
Assigning value4 to C.
与我需要的相同程序的输出:
Entering main function...
Entering fn1 function...
Assigning value1 to A.
Leaving fn1 function...
Assigning value2 to C.
Entering fn2 function...
Assigning value3 to B.
Assigning value4 to C.
Leaving fn2 function...
Leaving main function...
那么,“运行 myFunctionWithTraces 然后打印 myString”的 Haskell 习语是什么?
【问题讨论】:
-
由于您需要保证消息按特定顺序打印,因此不应使用 Debug.Trace。相反,咬紧牙关,在 IO 中运行,并使用
putStrLn或类似名称。 -
你在编译到 Haskell 吗?
标签: haskell io monads trace side-effects