2012-04-26 32 views
7

que he estado reflexionando en torno a la idea de cómo le gustaría construir un marco MVC en Haskell en el molde de WPF o AngularJS, pero parece que no puede encontrar los tipos de clave o idea para obtener empezado. Entonces, desafortunadamente, pregunta vaga: ¿alguien más ha estado pensando en este problema?framework MVC en Haskell

veo edit-lentes, multi-placa y Compos, pero creo que todos ellos resuelven problemas ligeramente diferentes.

Mi bosquejo de cómo funcionaría sería:

  1. crear un modelo como una estructura de datos sin formato Haskell
  2. Crear un conjunto de 'lentes' o comandos para modificar su modelo.
  3. Escribe un HTML (o lo que sea) la plantilla que se parametrizable por los tipos en el modelo.

.

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

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

Entonces me gustaría ser capaz de escribir una función:

Model -> Template Model -> Html 

y una función para actualizar partes de mi vista cuando solicito una lente.

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

así que supongo que la pregunta es - qué tipo sería una lente tomar que puede operar en una estructura de datos, a continuación, se utiliza para describir el cambio en otra.

Una posibilidad parece ser crear un GADT que envuelva todos los lentes y luego plantilla el HTML sobre el tipo GADT que luego se puede usar para hacer coincidir con la plantilla en cada paso. p.ej.

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

Luego, un tipo de datos de plantilla Html, p.

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

Con el cual el elemento de unión se puede adaptar directamente.

pero que parece casi derrotar el punto, porque el modelo se une entonces a la cadera a la vista.

Me pregunto tiene cualquiera (más lista que yo) por ahí pensar acerca de cómo podría funcionar esto? O incluso si esta es una buena idea?

+1

He comenzado una biblioteca de lentes experimentales diseñada para admitir operaciones efectivas arbitrarias, que podría interesarle ver (no puedo recomendar que la use en este momento ya que la API cambiará, es experimental y fue rotunda) shat sobre cuando fue discutido en reddit). lo más cercano a su caso sería el último ejemplo en [esta publicación] (http://brandon.si/code/yall/); es probable que desee que su vista se modifique en 'Estado' cuando realice operaciones con lentes en el modelo:' LensM (State View) Model a' o algo por el estilo. pero no he usado mucho el patrón MVC, así que perdóneme si estoy fuera de – jberryman

+0

. Creo que es al menos la mitad de la solución, de modo que puede construir sus cambios a una vista (o modificar la vista directamente) . Sin embargo, creo que lo que me falta es un mecanismo para atravesar el modelo y la vista (modelo de plantilla) juntos: algún tipo de zip para atravesar las dos estructuras relacionadas al mismo tiempo. – Oliver

+0

Usted podría estar interesado en http://www.haskellforall.com/2014/04/model-view-controller-haskell-style.html – hdgarrood

Respuesta

9

He estado construyendo una gran aplicación comercial usando lentes-based "MVC" en Haskell.

  • estructuras de datos puramente funcional
  • lentes para establecer y obtener (y mantener los datos consistentes)
  • A DSL para la generación de una vista (plantilla) atado a cada lente.

Esta ha sido una gran experiencia, y definitivamente recomiendo el enfoque para la estructura detallada de la edición de estructuras complejas.

Las fuerzas de aproximación que

  • No Hack, pero las interfaces utilizan lentes como seguras para su modelo interno
  • Clara separación de la modelo -> vista
  • comprobación de tipos para todo - los tipos de lentes para generar código de vista

Hay muchas formas en que puede diseñarlo, pero creo que es un enfoque de diseño muy sólido. Querrá un buen soporte DSL para la parte de GUI.

+2

¿Puede elaborar en "A DSL para generar una vista (plantilla) vinculada a cada lente . "? suena tres genial – jberryman

+1

Básicamente, un lenguaje de plantilla que asocia un control mecanografiado en la pantalla con su lente correspondiente. Por lo tanto, los botones, la entrada de texto, la entrada numérica, etc. se pueden vincular al objetivo de edición para esa entrada, y los gráficos de dichos lentes se pueden cablear. La interfaz de usuario simplemente se cae. –

+0

Suena bien. Quiero hacer aplicaciones web locales usando Html como interfaz de usuario usando un método similar. (O con UHC Javascript algún día). Saludos :) – Oliver

Cuestiones relacionadas