J'ai une fonction qui se présente comme suit:F # rendement efficace?
let isInSet setElems normalize p =
normalize p |> (Set.ofList setElems).Contains
Cette fonction peut être utilisée pour vérifier rapidement si un élément fait partie sémantiquement d'un certain jeu; par exemple, pour vérifier si un chemin de fichier appartient à un fichier html:
let getLowerExtension p = (Path.GetExtension p).ToLowerInvariant()
let isHtmlPath = isInSet [".htm"; ".html"; ".xhtml"] getLowerExtension
Cependant, lorsque j'utilise une fonction telle que ce qui précède, la performance est médiocre puisque l'évaluation du corps de la fonction comme écrit dans « isInSet » semble être retardé jusqu'à ce que tous les paramètres soient connus - en particulier, des bits invariants tels que (Set.ofList setElems).Contains
sont réévalués à chaque exécution de isHtmlPath
. Comment puis-je maintenir au mieux le caractère succinct et lisible de F # tout en obtenant le comportement le plus efficace dans lequel la construction de l'ensemble est pré-évaluée.
Ce qui précède est juste un exemple; Je cherche une approche générale qui évite de m'enfermer dans les détails d'implémentation - si possible Je voudrais éviter d'être distrait par des détails tels que l'ordre d'exécution de la mise en œuvre puisque cela n'est généralement pas important pour moi et en quelque sorte sape un problème majeur point de vente de la programmation fonctionnelle.
Avez-vous un lien que vous recommanderiez de lire sur les expressions de calcul? J'ai l'idée mais je ne saisis pas tout à fait les détails ... –
@Eamon: J'ai ajouté deux liens à la fin de ma réponse. –
Merci pour le bon exemple et l'utilisation quelque peu hallucinante des expressions de calcul! Cela m'a finalement convaincu de les regarder de plus près - même si je ne suis pas sûr qu'ils en ont vraiment besoin ici. –