У меня есть функция, которая выглядит следующим образом:
let isInSet setElems normalize p =
normalize p |> (Set.ofList setElems).Contains
Эта функция может использоваться для быстрой проверки того, является ли элемент семантически частью некоторого набора; например, чтобы проверить, принадлежит ли путь к файлу html:
let getLowerExtension p = (Path.GetExtension p).ToLowerInvariant()
let isHtmlPath = isInSet [".htm"; ".html"; ".xhtml"] getLowerExtension
Однако, когда я использую функцию, подобную вышеприведенной, производительность низкая, так как оценка тела функции, записанного в «isInSet», кажется отложенной до тех пор, пока не известны все параметры - в частности, инвариантные биты, такие как (Set.ofList setElems).Contains
переоцениваются при каждом выполнении isHtmlPath
.
Как лучше всего сохранить краткую, читаемую природу F #, в то же время получая более эффективное поведение, при котором конструкция множества предварительно оценивается.
Выше просто пример ; Я ищу общий подход, который позволяет мне не тратить время на детали реализации - , где это возможно Я бы хотел не отвлекаться на детали, такие как порядок выполнения реализации, поскольку это обычно не важно для меня и подрывает главный пункт продажи функционального программирования.