2012-04-26 15 views
7

Byłem rozmyślałem wokół idei jak chcesz zbudować ramy MVC w Haskell w formie z WPF lub angularjs, ale nie wydaje się znaleźć podstawowe typy lub pomysł, aby dostać Rozpoczęty. Więc, niestety, niejasne pytanie - czy ktoś jeszcze zastanawiał się nad tym problemem?Obiektywy do MVC ram Haskell

widzę edit-soczewki, wielotarczowe i compos, ale myślę, że wszyscy oni rozwiązać nieco inne problemy.

Mój szorstki szkic jak to będzie działać będzie:

  1. Tworzenie modelu jako struktury danych zwykły Haskell
  2. Utwórz zestaw „szkieł” lub polecenia, aby zmodyfikować swój model.
  3. Napisz HTML (lub cokolwiek) szablon, który jest parametryzowany przez typy w modelu.

.

data Model = Page { _title :: String, _content :: [(Int, String)] } 

title :: Lens Model String 
content :: Int -> Lens Model (Maybe String) 

Następnie chciałbym, aby móc napisać funkcję:

Model -> Template Model -> Html 

oraz funkcję aktualizacji części moim zdaniem, kiedy stosuje się soczewki.

Lens Model a -> a -> HtmlTemplate Model -> [(Path, Html)] 

Sądzę więc, że chodzi o to, jaki typ obiektywu mógłby objąć jedną strukturę danych, a następnie można go wykorzystać do opisania zmiany w innej.

Jedną z możliwości wydaje się stworzenie GADT, który owija wszystkie soczewki, a następnie szablon HTML nad typem GADT, który można następnie wykorzystać do dopasowania do szablonu w każdym kroku. na przykład

data Lenses a b where 
    Title :: Lens Model String -> Lenses Model String 
    Item :: Lens Model String -> Lenses Model (Maybe String) 

Następnie typ danych szablonu HTML, np.

data HtmlTemplate a = Text String 
       | Element String [Attrib a] 
       | forall b. Binding (Lenses a b) (Html b) 

Do którego elementu powiązania można dopasować wzór bezpośrednio.

ale wydaje prawie pokonując punkt, ponieważ model jest następnie połączone na biodra do widzenia.

Zastanawiam się, czy ktoś (mądrzejszy ode mnie) zastanawiał się, jak to może działać? A może to dobry pomysł?

+1

Uruchomiłem eksperymentalną bibliotekę soczewek przeznaczoną do obsługi dowolnych, efektywnych operacji, które mogą Cię zainteresować (nie możesz polecać korzystania z niego w momencie, gdy interfejs API będzie się zmieniał, jest eksperymentalny i był okrągły o której mowa, kiedy to było omawiane na Reddicie). najbliższy twojej sprawie byłby ostatnim przykładem w [tym wpisie] (http://brandon.si/code/yall/); prawdopodobnie będziesz chciał, aby twój widok był modyfikowany w 'State', kiedy robisz obiektywy na modelu:' LensM (State View) Model a' lub coś w tym stylu. ale nie użyłem zbyt wiele wzorca MVC, więc wybacz mi, gdybym nie był – jberryman

+0

Myślę, że jest to co najmniej połowa rozwiązania, dzięki czemu można albo utworzyć zmiany w widoku (albo zmodyfikować widok bezpośrednio) . Myślę jednak, że to, czego mi brakuje, to mechanizm do przemierzania modelu i widoku (szablonowy model) razem - jakiś rodzaj zipa, który przemierza dwie powiązane struktury w tym samym czasie. – Oliver

+0

Możesz być zainteresowany http://www.haskellforall.com/2014/04/model-view-controller-haskell-style.html – hdgarrood

Odpowiedz

9

Zbudowałem dużą komercyjną aplikację wykorzystującą obiektyw "MVC" w Haskell.

  • czysto funkcjonalne struktury danych
  • soczewki do ustawiania i uzyskanie (i utrzymuje spójność danych)
  • DSL do generowania widoku (szablon) przywiązane do każdej soczewki.

To było wspaniałe doświadczenie i zdecydowanie polecam podejście do szczegółowej edycji struktury złożonych struktur.

Siły podejście do

  • Nie siekać, ale obiektywy użytku jako bezpieczne interfejsy do Twojego modelu wewnętrznego
  • Strong separacji od modelu -> Widok
  • Rodzaj sprawdzanie wszystkich typów soczewek - generowanie kodu widoku

Istnieje wiele sposobów na jego zaprojektowanie, ale uważam, że jest to bardzo rozsądne podejście do projektowania. Będziesz potrzebował dobrej obsługi DSL dla części GUI.

+2

Czy możesz opracować na "DSL do generowania widoku (szablonu) związane z każdym obiektywem . "? brzmi fajnie. – jberryman

+1

Zasadniczo, język szablonu, który łączy kontrolkę na ekranie z odpowiadającym jej obiektywem. Tak więc przyciski, wprowadzanie tekstu, dane liczbowe itp. Mogą być połączone z soczewką edycyjną dla tego wejścia, a wykresy takich soczewek mogą zostać połączone. Interfejs użytkownika po prostu wypada. –

+0

Brzmi nieźle. Chcę używać lokalnych aplikacji internetowych przy użyciu Html jako interfejsu użytkownika przy użyciu podobnej metody. (Albo z UHC Javascript pewnego dnia). Pozdrawiam :) – Oliver