我为Core Haskell编写了一个自定义的漂亮打印机,以便更好地研究Core的结构。这台漂亮的打印机的要点是它需要一个CoreModule,并在输出中包含数据构造函数,默认情况下Outputable
实现看起来没有。Core Haskell将函数应用于函数是什么意思?
这里是我上运行的漂亮打印机模块的代码:
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个。
这是什么意思?