MFlow - это веб-фреймворк, написанный на Haskell, в стиле Seaside, но без проблем продолжений (проблемы с постоянством и масштабируемостью)
Основная проблема веб-разработки заключается в том, что HTTP не использует состояние, что приводит к созданию модели программирования обработки событий, полной небезопасных идентификаторов переменных и обработчиков событий, упомянутых здесь и там. Состояние в большинстве случаев находится в форме хеш-таблиц динамически типизированных данных, поскольку обработчики событий не разделяют области переменных.
Основанные на продолжениях фреймворки, такие как ocsigen (ocaml) и seaside (smalltalk), прекрасно обрабатывают кнопку назад, они сохраняют состояние в обычных переменных, и навигацию можно понять, прочитав код. И они в основном RESTFul до определенного уровня. Но эти структуры не масштабируемы и имеют проблемы с постоянством из-за врожденных проблем продолжений.
Другая проблема веб-приложений заключается в отсутствии типов HTML, который может приводить к несоответствиям и ошибкам во время выполнения.
В MFlow не только каждая страница, но и вся навигация безопасна во время компиляции, и она не разделяет вышеуказанные проблемы. Он обладает хорошими свойствами основанных на продолжениях фреймворков, но он масштабируемый, так как вместо продолжений он использует ведение журнала и возврат. Он использует стандартные веб-библиотеки Haskell: WAI, formlets, stm, blaze-html. Имеет систему сменных автономных компонентов.
Это полное приложение с тремя страницами. В цикле он запрашивает два числа и показывает сумму. Вы можете нажать кнопку назад, как вам угодно. Там нет магических идентификаторов, которые вы должны поместить здесь, в файлах конфигурации, страницах и исходном коде:
module Main where
import MFlow.Wai.Blaze.Html.All
main= do
addMessageFlows [("sum", transient . runFlow $ sumIt )]
wait $ run 8081 waiMessageFlow
sumIt= do
setHeader $ html . body
n1 <- ask $ p << "give me the first number" ++> getInt Nothing
n2 <- ask $ p << "give me the second number" ++> getInt Nothing
ask $ p << ("the result is " ++ show (n1 + n2)) ++> wlink () << p << "click here"
Состояние можно сделать постоянным с небольшими изменениями.
http://hackage.haskell.org/package/MFlow
Здесь приведены примеры и инструкции: http://haskell -web.blogspot.com.es /