[Haskell] data: 구조체 패턴

[원본 링크]

data 타입은 하스켈에서 타 언어에서의 구조체, union 등에 대응되는 타입 선언 기능이다.
여기서는 구조체 형태의 기능에 대해서만 정리한다.




구조체

하스켈에서는 다음과 같은 형태로 복합 구조체 타입을 정의할 수 있다.
아래 코드는 "이름"과 "나이" 정보를 갖는 Person이라는 타입을 정의하는 예시다.

값을 선언할 때는 다음과 같은 형태로 만들 수 있다.

타입명에 중괄호 열고, 필드별로 값을 지정해주면 된다.

구조체의 필드를 참조하는 방법은 좀 특이하다. 구조체 필드로 함수 호출의 형태로 가져오게 되는데

이런 식이다. 필드명 자체가 해당 구조체의 필드를 가져오는 함수가 되는 것이다.




구조체의 파생 (deriving)

deriving은 Rust를 경험해봤다면, 그것과 거의 같다고 봐도 된다.
쉽게 말해서 구조체에 인터페이스(=타입클래스)를 자동구현시키는 것이다.

모든 타입클래스에 대해 사용할 수 있는건 아니고, 미리 준비된 범용적인 타입클래스에 대해서만 동작한다. Eq, Ord, Enum, Bounded, Show 같은 것들이 거기에 포함된다.

예를 들면, 구조체를 출력 가능한 문자열로 변환하는 동작은 그다지 복잡도가 없고 일반적이다.
이런걸 하나하나 직접 Show를 구현하는건 정말 불필요한 노동이다.

deriving에 Show만 박아주면 간단하게 처리가 가능하다.

저 Person에 대해서 Show 타입클래스의 인스턴스가 자동구현된 것이다.

그럼 이제 그대로 show를 불러서 써먹을 수 있다.



참조
https://stackoverflow.com/questions/3864647/how-does-deriving-work-in-haskell
https://www.haskell.org/onlinereport/derived.html#derived-appendix
https://medium.com/@recursivecurry/haskell-deriving-28ddbf2267da