일단 하스켈 자체를 방금 검색해보며 알아본 수준이라 이해도가 없는 수준인걸 감안하고 보셈
plus a b = a + b
main = return ()
여기서 plus는 타입도 명시하지 않고 호출조차 하지 않았는데 컴파일 에러가 안남, 즉 타입이 확정되어 컴파일됨
plus 정의에 등장하는 + 연산자를 적용가능한 a/b의 타입 범위중 가장 슈퍼타입을 골라 추론해주는 듯
(타입이 아니라 타입클래스가 정해지는 듯? 타입클래스가 인터페이스 비스무리한거 같은데 의미를 모르므로 패스)
plus a b = a + b
main = print $ plus 1.0 2.0
여기서는 plus를 호출했음
1.0, 2.0이 명시되어있으므로 이를 통해 1.0, 2.0에 적용될수 있는 가장 슈퍼타입을 추론
plus a b = a + b
main = do
print $ plus 1 2
print $ plus 1.0 2.0
여기서는 서로 다른 1, 2와 1.0, 2.0에 공통적으로 적용될수 있는 가장 슈퍼타입을 추론
슈퍼타입이 아니라 서브타입을 찾는거 아닌가? 가장 슈퍼면 당연히 맨날 똑같은거 나오는거 아니야? 사용례 추가될수록 변하는건 가장 서브 아닌가? 근데 예시와 맞는가와 별개로 슈퍼를 찾아야줘야하는게 맞는거 같기는함
사실 잘 모른다... 미안해...
(+) :: Num a => a -> a -> a라서 타입클래스 Num의 인스턴스인 타입 a를 찾는거임
+를 쓰는순간 타입클래스는 이미 정해진거고 이놈을 구현한? 타입 중에 뭐가 적절한가 찾는건가?
ㅇㅇ
principal type이라고 부름. a + b 처럼 말이 되는 타입이 여러가지인 expression 들이 있는데, 말이 되는 모든 타입들이 어떤 타입 T의 인스턴스이면 T를 principal type이라고 함
타입시스템에 따라 principal type이 존재하지 않거나 principal type을 찾는 알고리즘이 존재하지 않을 수 있음