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?
Odpowiedz
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
.
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.
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.
[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
To prawda, dobra uwaga. – phadej
Więcej informacji na temat zestawu i funkcji: http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunectors/ – phadej
- 1. Dlaczego ma się osobny moduł dla typów?
- 2. Kolekcje Java. Dlaczego nie ma typów pierwotnych?
- 3. Czy nie ma specjalizacji od std :: hash dla standardowych kontenerów?
- 4. Data.Foldable dla nieuporządkowanych kontenerów
- 5. Dlaczego nie ma wystąpienia wystąpienia dla funkcji?
- 6. stała poprawność dla kontenerów
- 7. Dlaczego nie ma metody getContentView() dla działania?
- 8. Dlaczego nie ma operatora [] dla std :: list?
- 9. Dlaczego nie ma wbudowanego typu dla DateTime?
- 10. Dlaczego nie ma Xcode dla Windows?
- 11. Dlaczego decltype usuwa const z typów zwracanych dla typów wbudowanych?
- 12. Dlaczego nie ma IntStream.flatMapToObj()?
- 13. Dlaczego nie ma jednolitej_dystrybucji?
- 14. Dlaczego struktury Dependency Injection obsługują hierarchie kontenerów?
- 15. Dlaczego Scala nie ma decltype?
- 16. Dlaczego nie ma std :: stou?
- 17. Dlaczego nie ma std :: protect?
- 18. Dlaczego nie możemy mieć typów "char" enum
- 19. Dlaczego tutaj nie jest pisana inferencja typów?
- 20. Równość dla typów anonimowych
- 21. Dlaczego nie ma UTF-24?
- 22. Dlaczego Python nie ma przełącznika?
- 23. Dlaczego nie ma std :: inplace_merge_unique?
- 24. Deque - dlaczego nie ma "rezerwy"?
- 25. Dlaczego nie ma obiektu StrongReference?
- 26. Dlaczego SLComposeViewController nie ma delegata?
- 27. Dlaczego nie ma instancji MonadMask dla narzędzia ExceptT?
- 28. Dlaczego nie ma konstruktora rezerwującego dla std :: string?
- 29. Dlaczego otrzymujemy "Ścieżka nie ma formy prawnej" dla konstruktora FileInfo?
- 30. dlaczego nie ma nazwy ścieżki dla niestandardowych tras w Rails
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
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
@Yuras - pojemniki powinny obsługiwać Traversable i Foldable (lub mieć dobry powód, aby nie robić). –