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:
- crear un modelo como una estructura de datos sin formato Haskell
- Crear un conjunto de 'lentes' o comandos para modificar su modelo.
- 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?
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
. 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
Usted podría estar interesado en http://www.haskellforall.com/2014/04/model-view-controller-haskell-style.html – hdgarrood