Haskell jest czysto funkcjonalnym językiem, co oznacza, że funkcje Haskella nie mają skutków ubocznych. We/wy jest implementowane za pomocą monad reprezentujących porcje obliczeń I/O.Czy można przetestować zwracaną wartość funkcji We/Wy Haskell?
Czy można przetestować zwracaną wartość funkcji Haskell I/O?
Powiedzmy mamy proste „World Hello” program:
main :: IO()
main = putStr "Hello world!"
Czy jest możliwe dla mnie, aby utworzyć wiązkę testową można uruchomić main
i sprawdzić, czy I/O monada zwraca poprawny 'wartość'? Czy też fakt, że monady mają być nieprzezroczystymi blokami obliczeń, powstrzymuje mnie przed zrobieniem tego?
Uwaga, nie próbuję porównywać wartości zwracanych operacji wejścia/wyjścia. Chcę porównać zwracaną wartość funkcji I/O - samą monadę wejścia/wyjścia.
Ponieważ w Haskell I/O jest zwracany, a nie wykonywany, miałem nadzieję zbadać fragment obliczeń We/Wy zwróconych przez funkcję wejścia/wyjścia i sprawdzić, czy było prawidłowe. Pomyślałem, że może to umożliwić testowanie funkcji I/O w jednostce w taki sposób, w jaki nie są one możliwe w językach imperatywnych, gdzie I/O jest efektem ubocznym.
Monady niekoniecznie są "nieprzezroczystymi" blokami obliczeń. Na przykład listy i może monady mają zachowanie widoczne dla aplikacji - monada IO jest jedyną (o której mi wiadomo) specjalnie zaprojektowaną do izolowania logiki programu od niektórych jego zachowań. –
Control.Monad.ST jest również dość nieprzejrzysty. – ephemient
Nie jestem do końca dobra z teorią Computational Theory. Ale czy to nie jest odpowiednik problemu zatrzymania? Mam na myśli, że masz funkcję, która zwraca program (działanie IO) i chcesz napisać inny program, aby statycznie przeanalizować go pod kątem poprawności. Czy to jest poprawny sposób opisania problemu? Czy to jest rozstrzygające? –