2013-07-17 19 views
5

Dowiedziałem się, że niektóre pojemniki mają bardzo podobny zestaw funkcji. Przykładowo: Lista, Zestaw, Sekwencja, Tekst i Bajtodje. Zastanawiam się, dlaczego nie używają jednej lub więcej typowych czcionek.Dlaczego nie ma typeklasy dla typów kontenerów?

+1

Właściwie tak. Ale lista "typowych typów" zwykle ogranicza się do 'Monoid',' Functor' i, czasami, 'ListLike'. Myślę, że tak jest, ponieważ inne klasy nie istnieją lub nie są dość powszechne. – Yuras

+3

Przy okazji spójrz na pakiet 'lens' dla biblioteki, która znalazła sposób na streszczenie tych wszystkich. Ale nie robi tego z nowymi typami, tak jak myślisz. – Carl

+2

@Yuras - pojemniki powinny obsługiwać Traversable i Foldable (lub mieć dobry powód, aby nie robić). –

Odpowiedz

7

W rzeczywistości są, zobacz pytanie Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations), które jest prawie duplikatem twojego.

Głównym powodem bycia w osobnym pakiecie jest prawdopodobnie rozszerzenie języka - zależności funkcjonalne lub rodziny typów. Musimy jakoś powiedzieć, że Text może zawierać tylko Char s, ByteString może zawierać tylko Word8 s, może zawierać dowolny typ, a Set może zawierać tylko instancje Ord.

9

Jaki mają wspólny zestaw funkcji? AFAICS, tylko możliwość łączenia wielu kontenerów w jeden i generowania pustych kontenerów. A oto, w rzeczywistości wszystkie one są Monoid, który oferuje dokładnie ten interfejs!

Z tym wszystkim nie można zrobić nic więcej, ponieważ niektóre są polimorficzne, niektóre monomorficzne.

3

polimorficzne pojemniki, takie jak listy, Sequence, Maybe i Map są przypadki Functor, Foldable i Traversable typeclasses.

Dla Set masz tylko Foldable, jako instancja Ord czyni niemożliwym do zdefiniowania innych (można zdefiniować fmap (Data.Set.map), które wypełniają prawa funktora, ale to wymagałoby podpis instancje Ord na argumentach).

Jak już wcześniej wspomniano, tekst i Bytestring mogą być instancjami o podobnych typach zdefiniowanych, ale potrzebne będą albo zależności funkcjonalne, albo rodziny typów.

+0

[Ustaw _is_ monoid] (http://hackage.haskell.org/packages/archive/containers/0.5.2.1/doc/html/src/Data-Set-Base.html#line-231): ponieważ ta klasa ma nie ma funkcji polimorficznej/zawartego typu jest ustalona w głowicy instancji, zachowuje się tam jak monomorficzny pojemnik. - Nawiasem mówiąc, istnieje nawet sprytny sposób, w jaki można [uczynić go Functor/Applicative/Monad] (http://copilotco.com/mail-archives/haskell-cafe.2007/msg00051.html); która wymaga powiązania instancji 'Ord' w GADT. – leftaroundabout

+0

To prawda, dobra uwaga. – phadej

+1

Więcej informacji na temat zestawu i funkcji: http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunectors/ – phadej

Powiązane problemy