클래스를 정의할 때, 디폴트 메소드의 서명을 정의할 때 씁니다.
GHC 공식 문서에 있는 예를 살펴보겠습니다.
class Enum a where
enum :: [a]
enum :: (Generic a, GEnum (Rep a)) => [a]
default= map to genum enum
Enum
클래스는 디폴트 enum
구현을 가지고 있지만 모든 타입들이 이 걸 쓸 수 있는 건 아닙니다. 예를 들어
-- 디폴트 구현을 쓰려면 만족해야 하는 제약
instance Generic Some ...
instance GEnum (Rep Some) ...
인 Some
이 있다면
instance Enum Some -- (디폴트를 쓸 때는 where 안써도 됨)
이렇게 default
구현을 쓰게 할 수 있지만, Generic
, GEnum
제약을 만족하지 못하는, 즉 해당 인스턴스가 없는 타입은 디폴트 구현을 쓸 수 없습니다.
enum :: (Generic a, GEnum (Rep a)) => [a] default
이 시그니처를 만족하는 타입만이 enum
구현을 쓸 수 있다는 제약입니다. 달리 말하면 디폴트 enum
에서 Generic
, GEnum
에 있는 메소드를 쓰고 있다란 뜻입니다.
-Ailrun님이 바로 잡아 주셨습니다. 감사합니다.