Należy wziąć pod uwagę ten kod (pobrany z here i zmodyfikowany w celu użycia bajtów zamiast linii znaków).Jak używać IO z Scalaz7 Iteratees bez przepełnienia stosu?
Uruchomienie tego kodu w pliku o przyzwoitej wielkości (8kb) generuje wyjątek StackOverflowException. Okazało się, że wyjątku można uniknąć, używając monostaty Trampolina zamiast IO, ale to nie wydaje się być doskonałym rozwiązaniem - poświęcić funkcjonalną czystość, aby program w ogóle się zakończył. Oczywistym sposobem na naprawienie tego jest użycie IO lub Trampoline jako Monad Transformer, aby owijać drugi, ale nie mogę znaleźć implementacji wersji transformatora któregokolwiek z nich i nie jestem wystarczająco dobrym guru do programowania funkcjonalnego, aby wiem, jak napisać własne (więcej informacji na temat FP jest jednym z celów tego projektu, ale podejrzewam, że tworzenie nowych transformatorów monad jest obecnie nieco powyżej mojego poziomu). Przypuszczam, że mógłbym po prostu owijać dużą akcję IO wokół tworzenia, uruchamiania i zwracania wyniku moich iteracji, ale to wydaje się bardziej rozwiązaniem niż rozwiązaniem.
Przypuszczalnie niektóre monady nie mogą być konwertowane na monadowe transformatory, więc chciałbym wiedzieć, czy można pracować z dużymi plikami bez upuszczania IO lub przepełnienia stosu, a jeśli tak, to w jaki sposób?
Dodatkowe pytanie: Nie mogę wymyślić, że iteratee może zasygnalizować, że napotkało błąd podczas przetwarzania, z wyjątkiem tego, że zwróci je, co powoduje, że tworzenie ich jest trudniejsze. Powyższy kod pokazuje jak używać EitherT do obsługi błędów w module wyliczającym, ale jak to działa dla iteratorów?
Może ci się przydać: http://termsandtruthconditions.herokuapp.com/blog/2013/03/16/free-monad/ – Impredicative
To dobre wyjaśnienie, dlaczego potrzebuję używać trampoliny, aby uniknąć przepełnienia stosu, ale nie obejmuje to korzystania z IO i Trampoliny. – Redattack34
IO jest już trampoliną. – Apocalisp