【发布时间】:2016-11-09 23:12:20
【问题描述】:
为了更好地研究 Core 的结构,我为 Core Haskell 编写了一个定制的漂亮打印机。这个漂亮的打印机的要点是它需要一个CoreModule 并在输出中包含数据构造函数,而默认的Outputable 实现似乎没有这样做。
这是我正在运行漂亮打印机的模块的代码:
module Bar2 where
add :: Int -> Int -> Int
add a b = a + b
add2 a b = a + b
这是漂亮的打印机输出:
------------------------------- Module Metadata --------------------------------
Module { "main" :: modulePackageId, "Bar2" :: moduleName }
-------------------------------- Type Bindings ---------------------------------
[r0 :-> Identifier ‘add’, rjH :-> Identifier ‘add2’]
-------------------------------- Core Bindings ---------------------------------
NonRec (Id "add2")
(Lam (TyVar "a")
(Lam (Id "$dNum")
(Lam (Id "a1")
(Lam (Id "b")
(App (App (App (App (Var (Id "+"))
(Type (TyVar (TyVar "a"))))
(Var (Id "$dNum")))
(Var (Id "a1")))
(Var (Id "b")))))))
NonRec (Id "add")
(Lam (Id "a")
(Lam (Id "b")
(App (App (App (App (Var (Id "+"))
(Type (TyConApp (Int) [])))
(Var (Id "$fNumInt")))
(Var (Id "a")))
(Var (Id "b")))))
--------------------------------- Safe Haskell ---------------------------------
Safe
------------------------------------- End --------------------------------------
让我感到困惑的是,在这两种情况下,Core 似乎都在将类型变量或类型构造函数应用于 + 函数,以及一些 $dNum 或 $fNumInt 在接受参数之前.
对于add 函数,类型也是明确给出的,而add2 则留给编译器推断。这似乎也影响了 lambda 函数链求值所需的参数数量,add 需要 2 而add2 需要 4。
这一切意味着什么?
【问题讨论】:
标签: function haskell types ghc lambda-calculus