Tengo una función que se ve de la siguiente manera:F # currying efficiency?
let isInSet setElems normalize p =
normalize p |> (Set.ofList setElems).Contains
Esta función se puede utilizar para comprobar rápidamente si un elemento es parte de un conjunto semántico; por ejemplo, para comprobar si una ruta de archivo pertenece a un archivo html:
let getLowerExtension p = (Path.GetExtension p).ToLowerInvariant()
let isHtmlPath = isInSet [".htm"; ".html"; ".xhtml"] getLowerExtension
Sin embargo, cuando se utiliza una función como la anterior, el rendimiento es pobre ya que la evaluación del cuerpo de la función como está escrito en "isInSet" parece que ser retrasada hasta que se conozcan todos los parámetros -, en particular, bits, invariantes tales como (Set.ofList setElems).Contains
se vuelven a evaluar cada ejecución de isHtmlPath
.
¿Cómo se puede mantener mejor que la naturaleza succint F # 's, legible al mismo tiempo conseguir el comportamiento más eficiente en el que se preevaluated la construcción de decorados.
Lo anterior es sólo un ejemplo; Estoy en busca de un enfoque general que me evita el empantanamiento en los detalles de implementación - cuando sea posible me gustaría evitar ser distraído por detalles como el orden de ejecución de la aplicación ya que eso es por lo general no es importante para mí y tipo de socava uno de los principales punto de venta de la programación funcional.
¿Tiene un enlace que le recomendaría leer sobre expresiones de cálculo? Entiendo la idea pero no entiendo los detalles ... –
@Eamon: Agregué dos enlaces al final de mi respuesta. –
¡Gracias por el gran ejemplo y el uso un tanto alucinante de las expresiones de cálculo! Esto finalmente me convenció de mirarlos más de cerca, incluso si no estoy seguro de que realmente los necesiten aquí. –