2013-08-22 14 views
7

Bardzo lubię Haskella, szczególnie silny system typów. Kiedy otrzymuję programy Haskella do kompilacji, są one generalnie wolne od błędów lub przynajmniej bardzo blisko.Bezpieczne korzystanie z przestrzeni typu Haskell

Jednak głównym problemem z Haskell jest jego nieznane wykorzystanie przestrzeni. Przynajmniej powiedzmy, C++, możesz być dość pewny co do wykorzystania przestrzeni programu. Jest całkiem jasne, kiedy konstruujesz i dekonstruujesz obiekty.

W Haskell rzeczy tak proste, jak fałdy, mogą wykorzystać ogromną ilość miejsca w puntach, jeśli nie zapisujesz ich poprawnie. Awaria programu spowodowana brakiem pamięci nie jest dużo lepsza niż jakiś inny błąd, prawdopodobnie gorszy.

Wiem, że istnieją sposoby na uniknięcie tych wycieków przestrzeni kosmicznej, ale szukam bezpiecznych sposobów na uniknięcie tych wycieków przestrzeni kosmicznej. Jak w przypadku, jeśli zrobię to źle, dostanę jakiś błąd kompilacji, nie tylko mam nadzieję, że mój program wywróci pamięć podczas jego produkcji. Cieszę się, na przykład, zastąpić standardowe funkcje biblioteki (może, powiedzmy, że krotnie, który ma błąd kompilacji, jeśli na przykład akumulator nie jest ścisły).

Czy coś takiego istnieje w Haskell?

+0

Zakładając to zoo http://blog.ezyang.com/2011/05/space-leak-zoo/ które powinny kontrolować typy systemów typu przecieki? Do streamingu nieszczelności są wystarczające. –

+0

Na przykład wycieki Thunk. Czy możesz również wyjaśnić, jak przewody pracują z czystym kodem, aby kontrolować wykorzystanie przestrzeni (np. Coś, co wycieka z listą, ale nie ma kanału? – Clinton

+0

Istnieje wiele konstrukcji, takich jak przewody, które są zaprojektowane tak, aby umożliwić przetwarzanie strumieni danych w czasie Są to iteracje, przewody, potoki i strumienie io, a także niektóre biblioteki do wysokowydajnych obliczeń, które dokonują optymalizacji zwanej fuzją strumieniową: –

Odpowiedz

1

Powszechnie uznaje się, że rozumowanie o kosmosie w Haskell jest niezwykle trudne. Stary (1987) książka Simon Peyton Jones

http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/

ma specjalny rozdział dotyczący tego tematu.

Mimo to, jeśli pisze się kod Haskella w określony sposób, na przykład za pomocą prostych generatorów można sterować wykorzystaniem pamięci. Poniższy artykuł (przedstawiony na APLAS 2012) podaje przykład rozumowania pamięci i opóźnienia dla dość złożonego algorytmu, liniowy ładny druk (BTW, standardowe ładne biblioteki drukowania w Haskell są dalekie od optymalnych: ich czas formatowania to nie O (n), gdzie n to długość wejścia). Wyniki eksperymentalne potwierdzają przewidywania dotyczące złożoności pamięci i czasu. Zobacz slajdy z wykładu APLAS, które pokazują fabułę.

http://okmij.org/ftp/continuations/PPYield/index.html

Powiązane problemy