2013-07-17 1 views
5

일부 컨테이너는 매우 유사한 기능 세트를 가지고 있다는 것을 알게되었습니다. List, Set, Sequence, Text 및 Bytestring을 예로들 수 있습니다. 왜 그들이 하나 이상의 공통 typeclasses를 사용하지 않는지 궁금합니다.컨테이너 유형에 대한 typeclass가없는 이유는 무엇입니까?

+1

사실 그들은 그렇습니다. 그러나 "공통 typeclasses"목록은 일반적으로 "Monoid", "Functor"및 때때로 "ListLike"로 제한됩니다. 다른 클래스가 존재하지 않거나 충분히 공통적이지 않기 때문입니다. – Yuras

+3

그건 그렇고, 모든 것들을 추상화하는 방법을 발견 한 라이브러리에 대한'lens' 패키지를보십시오. 하지만 새로운 타입 매스터클을 사용하면 생각할 수있는 방법이 아닙니다. – Carl

+2

@Yuras - 컨테이너는 Traversable 및 Foldable을 지원해야합니다 (또는하지 않는 것이 좋은 이유가 있음). –

답변

7

실제로는 귀하의 복제본 인 질문은 Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations)입니다.

별도의 패키지에 포함되어있는 주된 이유는 기능적 종속성 또는 형식 계열 중 하나 인 언어 확장이 필요할 가능성이 높기 때문일 수 있습니다. 우리는 어떻게 든 TextChar의, ByteStringWord8의를 포함 할 수 있습니다를 포함 할 수있다 '라고해야, []는 모든 유형을 포함 할 수 있으며 SetOrd의 인스턴스를 포함 할 수 있습니다. 추천 목록

9

그들이 갖고있는 공통 기능 세트는 무엇입니까? AFAICS, 하나의 컨테이너에 여러 컨테이너를 결합하고 빈 컨테이너를 생성하는 기능. 그리고 실제로, 그들은 정확히 그 인터페이스를 제공하는 모두 Monoid입니다!

일부는 다형성을 갖기 때문에 이러한 모든 작업을 수행 할 수 없습니다. 일부는 단일형입니다.

3

다형성 기, Sequence, MaybeMapFunctor, FoldableTraversable typeclasses의 인스턴스이다.

오드 인스턴스가 불가능한 다른 사람을 정의 할 수 있습니다 당신이 만 FoldableSet를 들어

(당신은 펑터의 법을 순종하는) fmap (Data.Set.map을 정의 할 수 있지만 인수에 오드 인스턴스를 필요로 서명입니다).

앞서 언급했듯이 텍스트 및 바이트 스트링은 정의 된 유사한 유형 클립의 인스턴스가 될 수 있지만 기능 종속성이나 유형 계열이 필요합니다.

+0

[Set _is_ monoid] (http://hackage.haskell.org/packages/archive/containers/0.5.2.1/doc/html/src/Data-Set-Base.html#line-231) :이 클래스에는 다형 함수/포함 된 유형이 인스턴스 헤드에서 고정되어 있지만, 거기에 모노 형태 컨테이너로 작동합니다. - 덧붙여 말하자면, [Functor/Applicative/Monad로 만들 수있는] 영리한 방법이 있습니다 (http://copilotco.com/mail-archives/haskell-cafe.2007/msg00051.html). GADT에서 Ord 인스턴스를 바인딩해야합니다. – leftaroundabout

+0

사실, 좋은 지적. – phadej

+1

세트 앤 Functor에 대한 추가 정보 : http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunctors/ – phadej

관련 문제