haskell - usar - que es mas recomendable lentes de contacto o anteojos
¿Cuáles son las ventajas y desventajas de usar lentes? (2)
Lenses no parecen tener ninguna desventaja mientras que tienen ventajas significativas sobre Haskell estándar: ¿Hay alguna razón por la que no deba usar lentes siempre que sea posible? ¿Hay consideraciones de rendimiento? Además, ¿la plantilla Haskell tiene una sobrecarga significativa?
Estoy asumiendo el paquete de lentes de datos . Los lentes funcionaron muy bien para mí en cosas similares a datos (registros, tuplas, mapas, etc.). De hecho, a veces incluso se desempeñaron mejor que el enfoque normal, probablemente debido a un mejor intercambio. En términos de rendimiento, produce aproximadamente el mismo rendimiento que el código que habría escrito a mano.
Sin embargo, hay cosas parecidas a una función, para las cuales los lentes pueden tener una penalización. Por ejemplo, recuerdo que al menos una vez usé una lente como esta:
result :: (Eq a) => a -> Lens (a -> b) b
Si bien las consultas fueron muy rápidas, ocasionalmente anulé ciertos valores de resultado de la función para ajustarla a escenarios particulares, lo que equivale a encerrar el cuerpo de la función en un gran if
. Las implicaciones de rendimiento no están relacionadas con las lentes en sí, por supuesto, pero es algo notable.
Las lentes forman una alternativa al uso de cierres directos sobre constructores de datos. Por lo tanto, las lentes tienen aproximadamente las mismas advertencias de usar funciones y constructores de datos directamente.
Algunos de los contras debido a esto:
Cada vez que modifica una lente, puede causar que se vuelvan a crear muchos objetos. Por ejemplo, si tiene esta estructura de datos:
A { B { C { bla = "foo" } } }
... y la lente de tipo
Lens A String
, creará una nuevaA
,B
yC
cada vez que "modifique" esa lente. Esto no es nada inusual en Haskell (crear muchos objetos), pero la creación de objetos está oculta detrás de la lente, lo que hace que sea difícil de detectar como un potencial de caída de rendimiento.- Una lente también podría crear ineficiencias debido a la "función de mapeo" que se está utilizando. Por ejemplo, si crea una lente que modifica el elemento 26 en una lista, puede causar una gran cantidad de ralentizaciones debido al tiempo de búsqueda.
Y los pros:
- Las lentes, en combinación con los registros normales, se pueden usar a la perfección con las mónadas estatales (consulte
data-lens-fd
para ver un ejemplo), y esto permite evitar la recreación de muchos objetos la mayor parte del tiempo, debido al amplio intercambio de datos. . Vea, por ejemplo, la función defocus
, y un patrón similar de uso dewithSomething
funciones conwithSomething
en el marco de Snap Web. - Las lentes obviamente no modifican ninguna memoria en el lugar, por lo que son muy útiles cuando necesitas razonar sobre el estado en el contexto de la concurrencia. Por lo tanto, las lentes serían muy útiles cuando se trata de gráficos de varios tipos.
Sin embargo, las lentes no siempre son isomorfas para cierres sobre constructores de datos. Estas son algunas de las diferencias (tomando data-lens
como la implementación aquí):
- La mayoría de las implementaciones de lentes utilizan algún tipo de tipo de datos para almacenar el "elemento de acceso" y el "mutador" como un par. Para
data-lens
, es laStore
Comonad . Esto significa que cada vez que cree una lente, habrá una sobrecarga adicional muy pequeña debido a la creación de esa estructura de datos. - Debido a que los lentes dependen de los valores a través de algún mapeo desconocido, podría ser más difícil razonar sobre la recolección de basura, y podría tener pérdidas (lógicas) de memoria porque olvidó que está usando una lente muy genérica que depende de una gran cantidad de memoria. Tomemos, por ejemplo, una lente que accede a un elemento en algún vector grande, que está compuesto por otra lente que oculta la primera lente, lo que dificulta ver que la lente compuesta aún depende de la gran cantidad de memoria.
El código de Haskell de la plantilla se ejecuta en tiempo de compilación, y no afecta el rendimiento en tiempo de ejecución de las lentes de ningún tipo.