我正在做一个Haskell项目,该项目要求我将Haskell程序转换为其GHC Core形式,并用其类型注释每个子表达式。例如,给定阶乘函数:
fac 0 = 1
fac n = n * fac (n - 1)
在此示例中,我想获取(n == 0),1,(n * fac(n-1)),n,fac(n-1)和(n-1)的类型。即程序中所有子表达式的类型。我该如何进行呢?
一种可能性是使用CoreUtils中的exprType。但是然后,我将不得不在3个调用中分别查询(n * fac(n-1)),n和fac(n-1)的类型?有更好的方法吗?
我认为可以减少查询的数量有两个原因:一:已经执行了类型检查,并且在程序树的“某些”部分中标注了类型。第二:由于我正在寻找所有可能的子表达式,因此会有很大的重叠。例如,由于fac的类型为Int-> Int,n的类型为Int,而fac(n-1)的类型为Int等。我认为可以通过某种形式的推理来最小化/消除这种重叠?
TLDR:有没有一种有效的方法来用相应的类型注释Haskell Core中的每个子表达式?