[Haskell] 타입 클래스
타입 클래스란 다형적인 연산을 지원하는 타입을 말한다.
생각해보자.
- 연산 등은 Int, Double 등의 여러가지 숫자 타입에 대해서 전부 올바르게 동작한다.
이건 하스켈에서 +가 Num이라는 타입 클래스를 통해 구현이 되어있기 때문이다. 이런걸 타입 클래스 다형적이라고 부른다.
말이 좀 복잡한데, 대충 비교하자면 자바 등 OOP 언어의 인터페이스나 제너릭과 비슷한 기능을 한다고 할 수 있다.
타입 클래스는 class 키워드로 선언할 수 있다.
class** 타입클래스명 타입변수1 타입변수2 ... where
** 함수명 :: 함수타입...
타입 변수명은 소문자로 시작해야 하며, 관례적으로 a, b 등의 순서로 사용하는 편이다.
한번 써보자.
난 Int 타입으로 변환시킬 수 있다는 의미를 가진 타입클래스 Intable을 정의해볼 것이다.
그럼 Intable을 충족하는 타입은, toInt 함수를 통해 Int 타입으로의 캐스팅이 가능해지는 것이다.
물론 이것만으로는 아무것도 되지 않는다.
구현한게 없기 때문이다.
타입 클래스를 구현하려면, instance 키워드를 통해 타입별로 실제 기능을 구체화할 수 있다.
instance** 타입클래스명 구체타입 where
** 함수구현...
Bool 타입을 먼저 구현해보자. 만약 True가 들어오면 1, False면 0이 되도록 할 것이다.
잘 굴러간다.
이번엔 Double 타입을 구현해보자. 마찬가지로 instance를 사용해 구체화하면 된다.
반올림해서 정수값으로 변환하도록 했다. round가 반올림 내장함수다.
그럼 이렇게 Bool과 Double이라는 복수 타입에 대해 동시에 잘 작동하는 걸 볼 수 있다.
이제 toInt이란 함수는 타입 클래스 다형적인 함수가 된 것이다!
그리고 저기서 Double 버전을 사용할때, 타입 어노테이션(::)을 통해 타입을 명시해줬는데. 정수나 실수 리터럴은 타입이 정해져있지 않아서 그렇다. 안붙이면 에러난다.
타입 클래스 자체도 대충 타입처럼 사용할 수 있다. 대신 제약구문이 들어가야 하는데...
Intable이 들어간다는 것을 표현하기 위해 Intable a => 로 가정을 한 다음에, a라는 이름으로 Intable임을 명시한다.
IO()는 print의 반환타입이다.
여튼 뭐 대충 저런식으로 쓰면 되는거다.