확장 DefaultSignatures

Posted on July 5, 2022

클래스를 정의할 때, 디폴트 메소드의 서명을 정의할 때 씁니다.

GHC 공식 문서에 있는 예를 살펴보겠습니다.

class Enum a where
  enum :: [a]
  default enum :: (Generic a, GEnum (Rep a)) => [a]
  enum = map to genum

Enum 클래스는 디폴트 enum 구현을 가지고 있지만 모든 타입들이 이 걸 쓸 수 있는 건 아닙니다. 예를 들어

-- 디폴트 구현을 쓰려면 만족해야 하는 제약
instance Generic Some ...
instance GEnum (Rep Some) ...

Some이 있다면

instance Enum Some -- (디폴트를 쓸 때는 where 안써도 됨)

이렇게 default 구현을 쓰게 할 수 있지만, Generic, GEnum 제약을 만족하지 못하는, 즉 해당 인스턴스가 없는 타입은 디폴트 구현을 쓸 수 없습니다.

default enum :: (Generic a, GEnum (Rep a)) => [a]

이 시그니처를 만족하는 타입만이 enum 구현을 쓸 수 있다는 제약입니다. 달리 말하면 디폴트 enum 에서 Generic, GEnum에 있는 메소드를 쓰고 있다란 뜻입니다.

-Ailrun님이 바로 잡아 주셨습니다. 감사합니다.

Github 계정이 없는 분은 메일로 보내주세요. lionhairdino at gmail.com