2012-04-26 13 views
7

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:

  1. Creare un modello come una struttura dati pianura Haskell
  2. Crea una serie di 'lenti' o comandi per modificare il vostro modello.
  3. 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?

+1

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

+0

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

+0

Potresti essere interessato a http://www.haskellforall.com/2014/04/model-view-controller-haskell-style.html – hdgarrood

risposta

9

Ho costruito una grande applicazione commerciale utilizzando "MVC" basato su obiettivi in ​​Haskell.

  • strutture dati puramente funzionali
  • lenti per impostare e ottenere (e mantenere i dati coerenti)
  • Un DSL per generare una visualizzazione (template) legato a ciascuna lente.

Questa è stata una grande esperienza e raccomando decisamente l'approccio per la modifica dettagliata della struttura di strutture complesse.

Le forze approccio di

  • Non hack, ma interfacce uso le lenti come sicuro da tuo modello interno
  • Forte la separazione del modello -> vista
  • controllo di tipo per ogni cosa - tipi di lenti per generare il codice della vista

Ci sono molti modi per progettarlo, ma penso che sia un approccio di progettazione molto valido. Volete un buon supporto DSL per la parte della GUI.

+2

Puoi approfondire "Un DSL per generare una vista (modello) legato a ciascun obiettivo . "? sembra molto bello. – jberryman

+1

Fondamentalmente, un linguaggio template che associa un controllo digitato sullo schermo con l'obiettivo corrispondente. Quindi i pulsanti, l'immissione di testo, l'input numerico ecc. Possono essere collegati all'obiettivo di editing per quell'input, e i grafici di tali obiettivi possono essere cablati. L'interfaccia utente poi cade. –

+0

Sembra bello. Voglio fare app web locali usando Html come interfaccia utente usando un metodo simile. (O con Javascript UHC un giorno). Saluti :) – Oliver

Problemi correlati