Ho riflettuto sull'idea di come costruire un framework MVC in Haskell nello stampo di WPF o AngularJS, ma non riesco a trovare i tipi chiave o l'idea per ottenere iniziato. Quindi, purtroppo, una domanda vaga: qualcun altro ha pensato a questo problema?Obiettivi per framework MVC in Haskell
Vedo obiettivi di modifica, multipiattaforma e Compos, ma penso che tutti risolvano problemi leggermente diversi.
mio ruvido schizzo di come dovrebbe funzionare sarebbe:
- Creare un modello come una struttura dati pianura Haskell
- Crea una serie di 'lenti' o comandi per modificare il vostro modello.
- Scrivere un modello HTML (o qualsiasi altra cosa) parametrizzato dai tipi nel modello.
.
data Model = Page { _title :: String, _content :: [(Int, String)] }
title :: Lens Model String
content :: Int -> Lens Model (Maybe String)
Allora io vorrei essere in grado di scrivere una funzione:
Model -> Template Model -> Html
e una funzione per aggiornare le parti del mio punto di vista, quando applico una lente.
Lens Model a -> a -> HtmlTemplate Model -> [(Path, Html)]
Quindi credo che la domanda è - quale tipo sarebbe un obiettivo di prendere in grado di operare su una struttura di dati, quindi essere usato per descrivere il cambiamento in un altro.
Una possibilità sembra essere quella di creare un GADT che avvolge tutti gli obiettivi e quindi di mascherare l'HTML sul tipo GADT che può quindi essere utilizzato per confrontarsi con il modello ad ogni passaggio. per esempio.
data Lenses a b where
Title :: Lens Model String -> Lenses Model String
Item :: Lens Model String -> Lenses Model (Maybe String)
Quindi un tipo di dati Template HTML, ad es.
data HtmlTemplate a = Text String
| Element String [Attrib a]
| forall b. Binding (Lenses a b) (Html b)
A cui è possibile associare direttamente l'elemento di rilegatura.
Ma sembra quasi sconfiggere il punto, perché il modello viene poi unito all'anca alla vista.
Mi chiedo se qualcuno (più intelligente di me) là fuori pensi a come potrebbe funzionare? O anche se questa è una buona idea?
Ho avviato una libreria di obiettivi sperimentale pensata per supportare operazioni con effetti arbitrari, che potreste essere interessati a guardare (non posso consigliarvi di usarlo al momento in cui l'API cambierà, è sperimentale ed è stata rotonda shat upon quando è stato discusso su reddit). il più vicino al tuo caso sarebbe l'ultimo esempio in [questo post] (http://brandon.si/code/yall/); probabilmente vorresti che la tua vista fosse modificata in 'State' quando esegui le ottiche sul modello:' LensM (State View) Model a 'o qualcosa del genere. ma non ho usato molto il pattern MVC, quindi perdonami se sono off – jberryman
Penso che sia almeno la metà della soluzione, in modo che tu possa o creare le tue modifiche a una vista (o modificare direttamente la vista) . Comunque penso che quello che mi manca è un meccanismo per attraversare insieme il modello e la vista (modello basato su modelli) - una sorta di zip per attraversare le due strutture correlate contemporaneamente. – Oliver
Potresti essere interessato a http://www.haskellforall.com/2014/04/model-view-controller-haskell-style.html – hdgarrood