我爲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個。
這是什麼意思?