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
은 컴파일러의 추론을받습니다. 이것은 또한 람다 함수 연쇄가 평가에 필요한 인수의 수에 영향을 미치는 것으로 보이며, add
은 2가 필요하고 add2
은 4를 필요로합니다.
이것은 모두 무엇을 의미합니까?