Zastanawiam się nad sposobami wykorzystania systemu typu Haskella do wymuszenia modułowości w programie. Na przykład, jeśli mam aplikację internetową, jestem ciekawy, czy istnieje sposób na oddzielenie całego kodu bazy danych od kodu CGI z kodu systemu plików z czystego kodu.Używanie systemu typu Haskella do wymuszania modularności
Na przykład, ja envisioning monady DB, więc mogę napisać funkcje jak:
countOfUsers :: DB Int
countOfUsers = select "count(*) from users"
Chciałbym to być niemożliwe do wykorzystania efektów ubocznych innych niż te obsługiwane przez monady DB. Wyobrażam sobie monadę wyższego poziomu, która byłaby ograniczona do bezpośrednich procedur obsługi adresów URL i byłaby w stanie komponować połączenia z monadą DB i monadą IO.
Czy to możliwe? Czy to jest mądre?
Aktualizacja: skończyło się to osiągnąć z Scala zamiast Haskell: http://moreindirection.blogspot.com/2011/08/implicit-environment-pattern.html
Dzięki, Don! To pierwsze rozwiązanie brzmi jak to, czego szukam. Czy wiesz, że jakieś specjalne pakiety, które używają tej techniki, lub dobre terminy do Google dla ("ograniczone IO Monada" nie pojawiły się wiele)? – Bill
Dobry przykład koncepcji "taint monad", http://blog.sigfpe.com/2007/04/trivial-monad.html –
Dzięki. Jeśli zdecyduję się użyć "skażonej monady" dla mojej monady DB, co mam zrobić, aby wyodrębnić dane z monady DB? Czy moja procedura obsługi HTTP musi używać transformatora Monada z DB? – Bill