次のような関数があります。
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# の簡潔で読みやすい性質を維持しながら、セットの構築が事前に評価されるより効率的な動作を維持するにはどうすればよいでしょうか。
上記は単なる例です。実装の詳細で行き詰まるのを回避する一般的なアプローチを探しています。実装の実行順序などの詳細に気を取られないようにしたいのですが、それは通常私にとって重要ではなく、主要なセールスポイントを損なうようなものだからです。関数型プログラミングの。