GHC에는 DeriveFunctor
, DeriveDataTypeable
등과 같은 몇 가지 언어 플래그가있어 Haskell 98에서 허용되는 유형 클래스 이외의 유형 클래스에 대해 파생 인스턴스를 컴파일러에서 생성 할 수 있습니다. 이는 특히 Functor
과 같은 유형에 대해 명백한 "자연"파생 인스턴스를 지시합니다.왜 GHC가 Monoid에 대한 인스턴스를 생성 할 수 없습니까?
그럼 Monoid
을 사용하지 않으시겠습니까? (의사 코드를 변명)
data T = MkT a b c ...
하나가 기계적으로 Monoid
인스턴스를 생성 할 수 있습니다 : 그것은 하나의 데이터 생성자 모든 데이터 유형에 대한 것 같아
instance (Monoid a, Monoid b, Monoid c, ...) => Monoid T where
mempty =
MkT mempty mempty mempty ...
mappend (MkT a1 b1 c1 ...) (MkT a2 b2 c2 ...) =
MkT (mappend a1 a2) (mappend b1 b2) (mappend c1 c2) ...
내가 알고 있어요 그 derive 패키지 provides this, 하지만 제 질문은 GHC가 왜 그런지에 대한 질문입니다.
@sdcvvc : 이것은 질문에 대한 유효한 대답 인 것 같습니다. 아마도 당신은 그것을 게시해야합니까? –
좋아, 대답했다. – sdcvvc
일반적으로 'Functor'인스턴스를 만드는 유일한 방법이 있습니다. '모노 이드 '에 대해서도 마찬가지입니다. – augustss