2011-01-13 13 views
6

Api api kolekcji ma kilka interesujących właściwości i zastanawiam się, jak można to zaimplementować w Haskell; lub jeśli jest to nawet możliwe (lub ogólnie dobry pomysł). Jestem trochę początkującym fanem, więc chciałbym usłyszeć twoje myśli.Czy jest możliwe utworzenie api kolekcji jak Scala 2.8 w Haskell?

Definicja scala mapa wygląda następująco:

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That 

Interesującą cechą tego rozwiązania jest to, że jeśli mapa na sznurku a funkcja map zwraca znak, wynik będzie od typu string (i nie lista znaków).

+3

W Haskell, ciąg * jest * wykaz znaków. (To nie odpowiada na twoje pytanie w ogólnym przypadku, ale myślałem, że to nic nie warte.) – mipadi

+2

Dobra biblioteka Scali (2.8) API rozwiązuje problemy związane z * istniejącymi * typami i jak ładnie z nimi grać. Dwa największe przykłady to 'String' i tablice. Bez wspomnianych problemów z istniejącymi typami, wierzę, że wiele domyślnych budowniczych jest niepotrzebnych (są one zaprojektowane, aby umożliwić "zwijanie" do kontenera tego samego typu, co dane wejściowe). –

+3

pst, nie tak. Zobacz ten przykład z Martina Odersky'ego (http://stackoverflow.com/questions/1722726/is-the-scala-2-8-collections-library-a-case-of-the-the-the-suite-suicide-note-in-histo/1728140 # 1728140) gdzie problem polega na tym, że BitSet ma bardzo wydajną reprezentację, która jest kompatybilna tylko z intami, ale chcielibyśmy móc go traktować jak dowolny zestaw z mapą itp. Jeśli był to tylko problem "istniejących typów" następnie BitSet może zostać odrzucony. –

Odpowiedz

6

Mamy coś mniej więcej tak powszechnego, jak API Scala. Nazywa się Foldable.

class Foldable t where 
    fold :: Monoid m => t m -> m 
    foldMap :: Monoid m => (a -> m) -> t a -> m 
    foldr :: (a -> b -> b) -> b -> t a -> b 
    foldl :: (a -> b -> a) -> a -> t b -> a 
    foldr1 :: (a -> a -> a) -> t a -> a 
    foldl1 :: (a -> a -> a) -> t a -> a 

http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Foldable.html

+0

Używając 'foldMap' wynikowa kolekcja (odpowiednik' Tego 'ze Scala) zależy od tego, który monoid jest wybrany? Czy są to wszystkie monoidy kolekcji? –

+1

@Grazer, prawie wszystkie kolekcje są monoidami. W szczególności wszystkie kolekcje dostarczane przez pakiet kontenerów mają instancje Monoid. Największym podzbiorem kolekcji niemonidowych, które przychodzą na myśl, są kolekcje, które muszą zawierać co najmniej jeden element, ponieważ monidot wymaga kolekcji tożsamości (na przykład pustej). –

2

chcę powiedzieć, to funkcja map w Scala jest naprawdę bliżej do tego od Haskell:

fmap :: (Functor f) => (a -> b) -> f a -> f b 

Jeżeli typ lista jest tylko kolejnym funktora.

Powiązane problemy